题解 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];
}
posted @ 2019-01-24 20:09  G_A_TS  阅读(328)  评论(0编辑  收藏  举报