方格取数
题目分析
本题目是考察了dp中的数字三角形模型,只不过从一维上升到了二维。其中f[ i1 , j1 , i2 , j2 ] : 由数字三角形可以推广出从(1,1),(1,1)(1,1),(1,1)走到(i1,j1),(i2,j2)(i1,j1),(i2,j2)能获得的最大花生数目.
为什么不能分开走
分开两次走(贪心):第一次走到(n, n)求出最大值并记录路径令路径上点收益为0后再走一次。
第一次走为局部最优并且也对第二次走造成了影响,第二次走是在第一次影响下所能走的局部最优,不具备“无后效性”,因此分开两次走并不是全局最优解
主要思想
把 f[i1][j1][i2][j2]f[i1][j1][i2][j2] 转化为 f[k][i1][i2]。
其中k=i1+j1=i2+j2k=i1+j1=i2+j2: 两个小朋友同时走, 每个人走的步数和是一样的。即
故代码为
#include<iostream>
#include<algorithm>
using namespace std;
const int N=15;
int w[N][N];
int f[2*N][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=1;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<=n&&j1>=1&&j2<=n&&j2>=1) //判断是否越界
{
int t=w[i1][j1];
if(i1!=i2) //判断两个人是否走到同一方格
t+=w[i2][j2];
int &x=f[k][i1][i2];
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]<<endl;
return 0;
}