AcWing 275. 传纸条

跟方格取数那题类似,唯一的区别是不能经过同一点
但是由于题面保证了每个格子的贡献都是正数,所以只要保证当前两点不同即可,因为从同一点转移过来的会被从不同点转移过来给优化掉
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define fr first
#define se second

typedef pair<int, int> PII;
typedef unsigned long long ULL;

const int INF = 0X3f3f3f3f, N = 50 + 10, MOD = 1e9 + 10;

int w[N][N];
int f[2*N][N][N];

void work() {
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>w[i][j];
    
    for(int k=3;k<=n+m-1;k++){
        for(int i1=1;i1<=n;i1++)
            for(int i2=1;i2<=n;i2++){
                int j1=k-i1,j2=k-i2;
                if(i1==i2 || !j1 || !j2 || j1>m || j2>m ) continue;
                int &x=f[k][i1][i2],t=w[i1][j1]+w[i2][j2];
                // cout<<k<<" "<<i1<<" "<<j1<<" "<<i2<<" "<<j2<<" "<<t<<endl;
                x=max(x,f[k-1][i1][i2]+t);
                x=max(x,f[k-1][i1-1][i2]+t);
                x=max(x,f[k-1][i1][i2-1]+t);
                x=max(x,f[k-1][i1-1][i2-1]+t);
            }
    }
    
    cout<<f[n+m-1][n][n-1];
}

signed main() {
	
	work();

	return 0;
}
posted @ 2022-06-24 16:44  xhy666  阅读(28)  评论(0编辑  收藏  举报