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;