浅谈(DP):https://www.cnblogs.com/AKMer/p/10437525.html
题目传送门:https://www.luogu.org/problemnew/show/P1004
设(f[i][j][k][l])表示第一条路从((1,1))走到((i,j)),第二条路从((1,1))走到((k,l))能取的最大权值。
然后直接暴力四种更新。洛谷题解对于优化也讲了不少。(省选前刷这种水题是不是搞错了什么)
时间复杂度:(O(n^4))
空间复杂度:(O(n^4))
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int num[10][10];
int f[10][10][10][10];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
int main() {
n=read();
while(1) {
int x=read(),y=read(),v=read();
if(!(x+y+v))break;num[x][y]=v;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
for(int l=1;l<=n;l++) {
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k-1][l]+num[i][j]);
f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l-1]+num[i][j]);
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k-1][l]+num[i][j]);
f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l-1]+num[i][j]);
if(i!=k||j!=l)f[i][j][k][l]+=num[k][l];
}
printf("%d
",f[n][n][n][n]);
return 0;
}