题解 P1004 【方格取数】

关于 P1004 的题解

几个月没有来博客写题解 找借口不写题 了,40多道题已经腐烂在U盘中。

o( ̄▽ ̄)ブ

一开始看到题目,我的心情是苦闷mengbi的,我太弱啦,不还这种题的!

但si,这帅气的题目范围终究奠定了这道题水题的地位。

终于,我靠着不懈的毅力,以及强大的dalao题解团 得以AC了这道题,爽!!!

下面看看蒟蒻是如何连抄带做出这道题的吧?

(¬︿̫̿¬☆)

( ̄_, ̄ )

壹.

模拟方式~~

很好理解,假设有两个小人从起点一起走,至于在那里走,很好想的吗:


    scanf("%d",&n);
	while(x>0&&y>0&&v>0)
	{
		scanf("%d%d%d",&x,&y,&v);
		map[x][y]=v;
	}

嗯~ o( ̄▽ ̄)o,这个,好像 map 不可以用

氟铀碳钾

待会儿用 mmp


贰.

开始走。

两人位置分别为(i,j),(k,l) 。

两人的位置递推式应为:


f[i][j][k][l]=
max(
f[i-1][j][k-1][l],
f[i][j-1][k][l-1],
f[i][j-1][k-1][l],
f[i-1][j][k][l-1])
+mmp[i][j]+mmp[k][l];

p.s:十分温馨的提示:没有草稿纸的去死呦(_)


叁.

两个人碰到一起开始吵架怎么办?

到一起算了两次怎么办?

一位 dalao yjxyjx 说:““既然加了两遍,那就减去一遍啊”——楼下大佬&icydalao”。

说的好。

献上完整的代码:


#include<bits/stdc++.h>

using namespace std;

int n;
int x=1,y=1,v=1;
int mmp[15][15];
int f[15][15][15][15];
int mex(int a,int b,int c,int d)
{
	if(b>a)a=b;
	if(c>a)a=c;
	if(d>a)a=d;
	return a;
}
int main()
{
	scanf("%d",&n);
	while(x>0&&y>0&&v>0)
	{
		scanf("%d%d%d",&x,&y,&v);
		mmp[x][y]=v;
	}
	for(register int i=1;i<=n;i++)
	{
		for(register int j=1;j<=n;j++)
		{
			for(register int k=1;k<=n;k++)
			{
				for(register int l=1;l<=n;l++)
				{
					f[i][j][k][l]=mex(f[i-1][j][k-1][l],f[i][j-1][k][l-1],f[i][j-1][k-1][l],f[i-1][j][k][l-1])+mmp[i][j]+mmp[k][l];
					if((i==k)&&(j==l))
					{
                        f[i][j][k][l]-=(mmp[i][j]);
                    }
				}
			}
		}
	}
	printf("%d",f[n][n][n][n]);
	return 0;
}

关于 mex ,你懂的( ̄▽ ̄)"~~~


就这样,谢谢!!!

posted @ 2019-01-15 22:27  XSZCaesar  阅读(171)  评论(0编辑  收藏  举报