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;
}

本文作者:xhy666

本文链接:https://www.cnblogs.com/xhy666/p/16409472.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xhy666  阅读(29)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起