AcWing 1027. 方格取数
原题链接
中等
作者:
har
,
2020-06-12 16:11:55
,
所有人可见
,
阅读 404
分析思路
设两人同时走 所以步数总和永远相等,设x与y的和为k,那么状态表示就是f[k][i1][i2],表示从(1,1) (1,1)分别走到(k-i1) (k-k2)的收获最大值 那么转移方程就可以从四个方向考虑,设从左转移过来为1从上转移过来为0,那么共有①11②10③01④00 这四种情况每次转移时 判断坐标是否越界即可
问题
当时想的时候 觉得上一个状态应该是f[k-2][i1][i2] 因为两个人每次共走两步,但其实不然,k=i1+j1=i2+j2,所以 k-1=(i1-1)+j1 or i1+(j1-1)=(i2-1)+j2 or i2+(j2-1) 是这样去表示两个人的不同位置的 所以k-1即可
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int f[N+N][N][N];
int w[N][N];
int main()
{
int n;
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;
int t=w[i1][j1];
if(i1!=i2) t+=w[i2][j2];
int &x=f[k][i1][i2];
if(i1>=1&&i1<=n&&i2>=1&&i2<=n)
{
x=max(x,f[k-1][i1-1][i2-1]+t);
x=max(x,f[k-1][i1][i2-1]+t);
x=max(x,f[k-1][i1-1][i2]+t);
x=max(x,f[k-1][i1][i2]+t);
}
}
cout<<f[2*n][n][n];
}