这种做法正确吗?
就是把第一遍dp的值设为0然后再dp一遍,两遍答案加起来
个人感觉(dalao勿喷)把第一遍dp的值设为0的时候可能出问题
但这么做交上去就过了……
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int f[11][11],n,mp[11][11],x,y,z;
int main() {
cin>>n;
while(1) {
scanf("%d%d%d",&x,&y,&z);
if(x==0&&y==0&&z==0) break;
mp[x][y] = z;
}
for(int i = 1;i <= n;++ i) {
for(int j = 1;j <= n;++ j) {
f[i][j] = max(f[i-1][j],f[i][j-1])+mp[i][j];
}
}
int res = f[n][n],ans = f[n][n];
while(res) {
int bj = 0;
for(int i = 1;i <= n;++ i) {
for(int j = 1;j <= n;++ j) {
if(f[i][j] == res) {
res -= mp[i][j];
mp[i][j] = 0;
bj = 1; break;
}
}
if(bj) break;
}
}
memset(f,0,sizeof f);
for(int i = 1;i <= n;++ i) {
for(int j = 1;j <= n;++ j) {
f[i][j] = max(f[i-1][j],f[i][j-1])+mp[i][j];
}
}
cout<<ans + f[n][n];
return 0;
}