求问做法的正确性
查看原帖
求问做法的正确性
464542
GacHen楼主2022/9/1 22:16

这种做法正确吗?

就是把第一遍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;
}
2022/9/1 22:16
加载中...