题解 P1006 【传纸条】
看起来是道dp题
事实上确实是
四维dp基础:乌龟棋
双倍经验题:方格取数
我们以dp[i1][j1][i2][j2]表示当一条走到(i1,j1),另一条走到(i2,j2)时的总和
具体参考代码:
#include<bits/stdc++.h>
using namespace std;
int dp[51][51][51][51],n,m,jz[51][51];//反正数据小可以为所欲为
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>jz[i][j];
}
}
for(int i1=1;i1<=n;i1++)
{
for(int j1=1;j1<=m;j1++)
{
for(int i2=1;i2<=n;i2++)
{
for(int j2=j1+1;j2<=m;j2++)//反正数据小随便暴力
{
dp[i1][j1][i2][j2]=max(dp[i1-1][j1][i2-1][j2],max(dp[i1-1][j1][i2][j2-1],max(dp[i1][j1-1][i2-1][j2],dp[i1][j1-1][i2][j2-1])));//就是求最大值
if(i1==i2&&j1==j2)//大可删掉
{
dp[i1][j1][i2][j2]+=jz[i1][j1];
}
else
{
dp[i1][j1][i2][j2]+=jz[i1][j1];
dp[i1][j1][i2][j2]+=jz[i2][j2];
}
}
}
}
}
cout<<dp[n][m-1][n-1][m];
}