洛谷 P1005 传纸条

一道DP水题

状态:f[i][j][k][l]表示纸条1传到(i,j)位置,纸条2传到(k,l)位置时,所能获得的最大值,注意,因为题目说每个同学只帮传一次,所以(i,j)和(k,l)不能重合,所以l得从j+1枚举到m

状态转移方程:f[i][j][k][l]=max(max(f[i][j-1][k-1][l],f[i-1][j][k][l-1]),max(f[i][j-1][k][l-1],f[i-1][j][k-1][l]))+a[i][j]+a[k][l];

最后代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[51][51],f[51][51][51][51];
int main(){
       scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
             for(int k=1;k<=n;k++){
                 for(int l=j+1;l<=m;l++){
                     f[i][j][k][l]=max(max(f[i][j-1][k-1][l],f[i-1][j][k][l-1]),max(f[i][j-1][k][l-1],f[i-1][j][k-1][l]))+a[i][j]+a[k][l];
                 }
             }
        }
    }   
    printf("%d",f[n][m-1][n-1][m]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Laehcim/p/10809952.html