题目链接:
洛谷https://www.luogu.com.cn/problem/P1006
信息奥赛一本通http://ybt.ssoier.cn:8088/problem_show.php?pid=1853
这是一道动态规划题。
可以认为同时传了两次,设a[i][j]表示走了k步,第1条走到第i行,第2条走到第j列的最大值。
可以用01背包的原理把空间压掉1维这样只用开2维数组,时间复杂度O((m+n)*mn)。
代码:
#include<stdio.h> int a[101][101],s[101][101],m,n,a1; int main(){ scanf("%d%d",&m,&n); for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)scanf("%d",&s[i][j]); a[1][1]=s[1][1]; for(int k=2;k<=m+n;k++)for(int i=k-1;i>=1;i--)for(int j=k-1;j>=i;j--){ a1=a[i][j]; if(a[i-1][j-1]>a1)a1=a[i-1][j-1]; if(a[i][j-1]>a1)a1=a[i][j-1]; if(a[i-1][j]>a1)a1=a[i-1][j]; a[i][j]=a1+s[i][k-i]+s[j][k-j]*(i!=j); } printf("%d",a[m-1][m]); return 0; }
我可能写的不好,如果有问题,请帮忙指出,谢谢。