1. 程式人生 > >洛谷 P1005 傳紙條

洛谷 P1005 傳紙條

turn name i++ style ace scan 位置 pre 代碼

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

洛谷 P1005 傳紙條