E làm bài này bị time limit ạ
#include <bits/stdc++.h>
using namespace std;
int m, n, tong = 0, tong1 = 0;
int f[1005][1005];
vector<int> ip;
vector<int> jp;
vector<int> sht;
int main()
{
cin >> m >> n;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
cin >> f[i][j];
}
}
int i = 1, j = 1, a, b;
for(int g = 0; g <= ip.size(); g++){
while(i != m || j != n){
if(i < m){
a = f[i+1][j];
} else {
a = -1;
}
if(j < n){
b = f[i][j+1];
} else {
b = -1;
}
if(a != -1 && b != -1){
if(min(a,b) == a){
ip.push_back(i+1);
jp.push_back(j);
} else {
ip.push_back(i);
jp.push_back(j+1);
}
sht.push_back(tong);
}
if(max(a, b) != -1){
if(max(a,b) == a){
i++;
} else {
j++;
}
} else {
i = m; j = m;
}
tong += f[i][j];
}
if(tong > tong1)
tong1 = tong;
if(g <= ip.size()){
tong = sht[g];
i = ip[g];
j = jp[g];
}
}
cout << tong1;
return 0;
}
Tổng cộng 1 trả lời
Code này của bạn trông giống như là đang xét tất cả các đường đi vậy
Bài yêu cầu quy hoạch động O(n^2). Cụ thể bạn cần lưu giá trị min cho mỗi ô (giá trị ban đầu mỗi ô là 1000000009) gọi là mảng sum[1005][1005]. Mỗi lần đi đến một ô, vd đang ở ô i, j xét ô i+1, j cần thỏa mãn điều kiện (sum[i+1][j] > sum[i][j] + f[i + 1][j]). Thỏa mãn điều kiện thì thêm ô đấy vào một mảng để tiếp tục xét không thì continue vòng lặp
Kết quả là sum[n][m]