P1004 [NOIP 2000 提高组] 方格取数 题解

solve

  • 我是没看出来和传纸条有什么区别的
  • n<=9,直接四层循环
  • 转移方程:(白嫖毛竹老师的)
  • 那和传纸条有什么区别呢
  • 输入有区别还用你说
  • 当i1 == i2 && j1 == j2时,不是continue了,而是只加g[i1][j1](g[i1][j1]和g[i2][j2]一样而取过数后要改为0)
  • 可能在g[n][n]上有数,所以要在最后求值时加上g[n][n]

Code

#include<bits/stdc++.h>
using namespace std;
const int maxn=55;
int n,m;
int g[maxn][maxn];
int dp[maxn][maxn][maxn][maxn];
int mmax(int a,int b,int c,int d)
{
	a=max(a,b);
	a=max(a,c);
	a=max(a,d);
	return a;
}
int main()
{
	cin >> n;
	int x,y,w;
	while (cin >> x >> y >> w)
	{
		if (!x&&!y&&!w) break;
		g[x][y]=w;
	}
	for (int i1=1;i1<=n;i1++)
	{
		for (int j1=1;j1<=n;j1++)
		{
			for (int i2=1;i2<=n;i2++)
			{
				for (int j2=1;j2<=n;j2++)
				{
					if (i1 == i2 && j1 == j2)
					{
						dp[i1][j1][i2][j2]=mmax(dp[i1-1][j1][i2-1][j2],
											 dp[i1-1][j1][i2][j2-1],
											 dp[i1][j1-1][i2-1][j2],
											 dp[i1][j1-1][i2][j2-1])
											 +g[i1][j1];
						continue;
					}
					dp[i1][j1][i2][j2]=mmax(dp[i1-1][j1][i2-1][j2],
											 dp[i1-1][j1][i2][j2-1],
											 dp[i1][j1-1][i2-1][j2],
											 dp[i1][j1-1][i2][j2-1])
											 +g[i1][j1]+g[i2][j2];
				}
			}
		}
	}
	cout << dp[n][n-1][n-1][n]+g[n][n] << endl;
	return 0;
posted @ 2026-03-22 09:32  msjing  阅读(9)  评论(0)    收藏  举报