P1006

前面事情太多了,所以搁了很多的题没做

  • 第一个不容易想的点就是这两条路是不会重叠的,所以可以转化成两条都从原点出发不相交的路径
  • 第二点就是该如何去表示这两种路径,第一种是用四维数组存位置(这里非法解的递推不会影响到正解)
  • 第二种用3维数组存每条路径只需要一个纵坐标或者横坐标就行
  • 最后一点不好想的就是两条路径的长度一样,在去重的时候其实j>=i,相等的时候就是重叠的时候
    从这道题中可以知道dp表示路径的方法(利用横纵坐标的和),和八皇后的解法有异曲同工之处
    四维解法
#include<iostream>
#include<utility>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
int n,m;
//#define DEBUG
int page[55][55];
int dp[55][55][55][55];
int max1(int a,int b,int c,int d){
    return max(max(a,b),max(c,d));
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    fi(i,1,n) fi(j,1,m) cin >> page[i][j];
    fi(i,1,n) fi(j,1,m) fi(k,1,n) fi(l,j+1,m) dp[i][j][k][l] = max1(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]) + page[i][j] + page[k][l];
    cout << dp[n][m-1][n-1][m] << endl;
#ifdef DEBUG
    //freopen(D:\in.txt,r,stdin);
#endif
    return 0;
}

三维解法

#include<iostream>
#include<utility>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
//#define DEBUG
int dp[150][55][55];
int page[55][55];
int max1(int x,int y,int a,int b){
    return max(max(x,y),max(a,b));
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    fi(i,1,n) fi(j,1,m) cin >> page[i][j];
    fi(k,1,n+m) fi(i,1,m) fi(j,1,m) dp[k][i][j] = -1;
    dp[2][1][1] = 0;
    fi(k,3,n+m) fi(i,1,m-1) fi(j,i+1,m) {
        dp[k][i][j] = max1(dp[k-1][i-1][j],dp[k-1][i][j],dp[k-1][i-1][j-1],dp[k-1][i][j-1]);
        if(dp[k][i][j] == -1) continue;
        dp[k][i][j] += page[k-i][i] + page[k-j][j];
    }
    
    cout << dp[n+m-1][m-1][m] << endl;
#ifdef DEBUG
    //freopen(D:\in.txt,r,stdin);
#endif
    return 0;
}
posted @ 2022-03-11 15:18  Sun-Wind  阅读(42)  评论(0编辑  收藏  举报