AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 更多
    • 题解
    • 分享
    • 问答
    • 应用
  • App
  • 教育优惠
    New
  • 登录/注册

AcWing 275. 传纸条    原题链接    中等

作者: 作者的头像   Anonymous_Y ,  2023-11-20 23:46:25 ,  所有人可见 ,  阅读 16


0


这题真没啥难的,就是单纯拿来给我练手的

10min切掉

首先很明显dp(我居然还想了一会儿她到底能不能用)

但是由于题目说的是要传过去还要回来,其实就相当于选两条路,没有交点
用$f[i][j][k][l]$表示两条路径分别走到$(i,j)$和$(k,l)$时路径最大值。

注意因为没有交点要特判

f(i==k&&j==l) continue

然而我们可以发现一个小规律:$i+j=k+l$所以呢
我们可以杀掉一维,枚举$i,j,k$这时候$l$就可以出来啦~

完结撒花!


#include<bits/stdc++.h>
using namespace std;
int f[120][60][60];
int n,m;
int c[120][120];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>c[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                int l=i+j-k;
                if(i==k&&j==l&&(i!=n||j!=m)) continue;
                f[i][j][k]=max(max(f[i-1][j][k-1],f[i-1][j][k]),max(f[i][j-1][k-1],f[i][j-1][k]))+c[i][j]+c[k][l];
                //cout<<i<<" "<<j<<" "<<k<<" "<<l<<"__________";
                //cout<<f[i][j][k]<<endl;
            }
        }
    }
    cout<<f[n][m][n]<<endl;
    return 0; 
}
/*3 3
0 9 9 
6 1 8
2 3 0*/

0 评论

你确定删除吗?

© 2018-2023 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息