这题画风清奇,与这题相似。
状态设计:dp[step][i][j]代表已经走了step步,第一条路末尾在i行,第二条路末尾在j行。因为记录了步数,便得第一条路末尾在(step-i)列,第二条路末尾在(step-j)列。
转移方程:如果i==j那么(step-i)==(step-j),得两条路末尾处于同一点上
(1)两点重合:f[step][i][j]=max(f[step][i][j],f[step-1][i-a][j-b]+t+c[i][step-i]);
(2)两点不重合:f[step][i][j]=max(f[step][i][j],f[step-1][i-a][j-b]+c[i][step-i]+c[j][step-j]);
#include<bits/stdc++.h> using namespace std; const int N=105; int n,m,t,f[N*2][N][N],c[N][N]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&c[i][j]); for(int step=2;step<=n+m;step++) for(int i=max(1,step-m);i<=n&&i<step;i++) for(int j=max(1,step-m);j<=n&&j<step;j++) for(int a=0;a<=1;a++) for(int b=0;b<=1;b++) { t=c[i][step-i]; if(i!=j) t+=c[j][step-j]; f[step][i][j]=max(f[step][i][j],f[step-1][i-a][j-b]+t); } printf("%d\n",f[n+m][n][n]); return 0; }
原文:https://www.cnblogs.com/Siv0106/p/11722100.html