题目链接:https://www.tyvj.cn/Problem_Show.aspx?id=1011
状态转移方程:
f[k,x1,x2] = max(f[k-1,x1,x2],f[k-1,x1-1,x2],f[k-1,x1-1,x2-1],f[k-1,x1,x2-1]) + a[y1,x1] + a[y2,x2];
f[k,x1,x2]表示,第K步的时候,一条路的横坐标是x1,另一条路的横坐标是x2的时候所得到的最优解。另外,还要考虑一下,当x1==x2的时候的情况,这个时候,只能允许一条路走到那个位置。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 int a[51][51],f[100][51][51]; 7 int main(void) { 8 freopen("in1.txt","r",stdin); 9 int N,M; scanf("%d%d", &M, &N);for(int i=1;i<=M;++i)for(int j=1;j<=N;++j)scanf("%d",&a[i][j]); 10 for(int k=1;k<=M+N-3;++k)for(int x1=1;x1<=min(N,k+1);++x1)for(int x2=1;x2<=min(N,k+1);++x2) { 11 f[k][x1][x2]=max(max(f[k-1][x1][x2],f[k-1][x1-1][x2]),max(f[k-1][x1][x2-1],f[k-1][x1-1][x2-1])); 12 if (x1==x2)f[k][x1][x2]+=a[k-x1+2][x1]; else f[k][x1][x2]+=(a[k-x1+2][x1]+a[k-x2+2][x2]); 13 } printf("%d\n",f[M+N-3][N][N-1]); 14 return 0; 15 }
昨天看了一篇文章,才发现,其实,题解是写给自己看的-_-#