传纸条
解题代码
#include<iostream>
using namespace std;
const int N=55;
int f[N*2][N][N];
int w[N][N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>w[i][j];
for(int k=2;k<=n+m;k++)
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++)
{
int j1 = k - i1, j2 = k - i2;
if(j1>=1&&j1<=m&&j2>=1&&j2<=m)
{
int t=w[i1][j1];
if(i1!=i2)t+=w[i2][j2];
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2-1]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);
}
}
cout<<f[n+m][n][n];
return 0;
}
方格取数代码对比
#include<iostream>
using namespace std;
const int N=11;
int f[N*2][N][N];
int w[N][N];
int n;
int main()
{
cin>>n;
int a,b,c;
while(cin>>a>>b>>c,a||b||c) w[a][b]=c;
for(int k=2;k<=2*n;k++)
for(int i1=1;i1<=n;i1++)
for(int i2=1;i2<=n;i2++)
{
int j1 = k - i1, j2 = k - i2;
if(j1>=1&&j1<=n&&j2>=1&&j2<=n)
{
int t=w[i1][j1];
if(i1!=i2)t+=w[i2][j2];
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2-1]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);
}
}
cout<<f[n+n][n][n];
return 0;
}