#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int g[1001][1001];
int c[1001][1001];
int n, m;
void input();
void todo();
void v() {
puts("");
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j)
cout << c[i][j] << ' ';
puts("");
}
puts("");
}
int main(){
input();
todo();
printf("%d", c[n-1][m-1]);
return 0;
}
void todo() {
c[0][0] = g[0][0];
for(int i = 0; i < m; ++i)
c[i][0] = g[i][0] + c[i - 1][0];
for(int i = 1; i < m; ++i) {
for(int j = 0; j < n; ++j) {
int t = c[j][i - 1] + g[j][i];
if(t > c[j][i])
c[j][i] = t;
if(c[j + 1][i] < t + g[j + 1][i]) {
c[j + 1][i] = t + g[j + 1][i];
for(int k = j + 1; k < m; ++k) {
c[k][i] = c[k - 1][i] + g[k][i];
}
}
if(c[j - 1][i] < t + g[j - 1][i]) {
c[j - 1][i] = t + g[j - 1][i];
for(int k = j - 1; k >= m; --k) {
c[k][i] = c[k + 1][i] + g[k][i];
}
}
}
}
}
void input() {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
scanf("%d", &g[i][j]);
memset(c, 0xf0, sizeof(c));
return ;
}
程序思路:
每次求出单列每格的最优解,一列列往下递推
这种方法我同学能得70分,各位dalao帮忙看下哪里有错,谢谢!