1043 方格取数
2000年NOIP全国联赛提高组
++++++++++++++++++++++++++
首先感叹此题比较坑。
这题和传纸条的思路一样,本人弱菜,所以先给一个4维 的动归,3维的日后再给
注意:(1)要注意边界
(2)要注意初始点和终止点也有值,且第一次遍历过后也会初始化为0
+++++++++++代码如下+++++++++++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int a[12][12],f[12][12][12][12],n,x,y,w;
int mmax(int x,int y,int z,int k)
{
x=x>y?x:y;z=z>k?z:k;
return max(x,z);
}
int main()
{
cin>>n;
while (cin>>x>>y>>w)
if (x&&y)
a[x][y]=w;
for (int i_1=1;i_1<=n;i_1++)
for (int j_1=1;j_1<=n;j_1++)
for (int i_2=1;i_2<=n;i_2++)
for (int j_2=1;j_2<=n;j_2++)
{
if (i_1<=n&&i_2<=n&&j_1<=n&&j_2<=n)
if ((i_1!=i_2&&j_1!=j_2)
||(i_1==n&&j_1==n&&j_2==n&&j_1==n)
||(i_1==1&&j_1==1&&j_2==1&&j_1==1))
{f[i_1][j_1][i_2][j_2]=mmax(f[i_1-1][j_1][i_2-1][j_2],
f[i_1][j_1-1][i_2][j_2-1],
f[i_1-1][j_1][i_2][j_2-1],
f[i_1][j_1-1][i_2-1][j_2]
)+a[i_1][j_1]+a[i_2][j_2];
}
}
cout<<f[n][n][n][n]-a[1][1]-a[n][n];
return 0;
}