洛谷P1006 信息奥赛一本通1853 传纸条

题目链接:
洛谷https://www.luogu.com.cn/problem/P1006

信息奥赛一本通http://ybt.ssoier.cn:8088/problem_show.php?pid=1853

这是一道动态规划题。

可以认为同时传了两次,设a[i][j]表示走了k步,第1条走到第i行,第2条走到第j列的最大值。

可以用01背包的原理把空间压掉1维这样只用开2维数组,时间复杂度O((m+n)*mn)。

代码:

#include<stdio.h>
int a[101][101],s[101][101],m,n,a1;
int main(){
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)scanf("%d",&s[i][j]);
    a[1][1]=s[1][1];
    for(int k=2;k<=m+n;k++)for(int i=k-1;i>=1;i--)for(int j=k-1;j>=i;j--){
        a1=a[i][j];
        if(a[i-1][j-1]>a1)a1=a[i-1][j-1];
        if(a[i][j-1]>a1)a1=a[i][j-1];
        if(a[i-1][j]>a1)a1=a[i-1][j];
        a[i][j]=a1+s[i][k-i]+s[j][k-j]*(i!=j);
    }
    printf("%d",a[m-1][m]);
    return 0;
}

我可能写的不好,如果有问题,请帮忙指出,谢谢。

原文地址:https://www.cnblogs.com/sy666/p/12722707.html