luogu1006 【2008提高】传纸条(dp)

来源:互联网 发布:通达信软件编程 编辑:程序博客网 时间:2024/06/02 07:31

同方格取数,三维dp,注意一下边界就好了。详见方格取数博文。

#include <bits/stdc++.h>inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}inline int min(int x,int y){return x<y?x:y;}inline int max(int x,int y){return x>y?x:y;}#define N 52int f[N<<1][N][N],n,m,a[N][N];int main(){//  freopen("a.in","r",stdin);    m=read();n=read();m--;n--;    for(int i=0;i<=m;++i)        for(int j=0;j<=n;++j) a[i][j]=read();    memset(f,128,sizeof(f));f[0][0][0]=0;    for(int i=1;i<=n+m;++i)        for(int j=0;j<=m&&j<=i;++j)            for(int k=0;k<=m&&k<=i;++k){                f[i][j][k]=max(max(f[i-1][j][k],f[i-1][j][k-1>0?k-1:0]),max(f[i-1][j-1>0?j-1:0][k],f[i-1][j-1>0?j-1:0][k-1>0?k-1:0]));                f[i][j][k]+=a[j][i-j];                if(j!=k) f[i][j][k]+=a[k][i-k];            }    printf("%d\n",f[n+m][m][m]);    return 0;       }
原创粉丝点击