1. 程式人生 > >Luogu 1006 傳紙條

Luogu 1006 傳紙條

sca source 兩張 狀態轉移方程 一個 for print OS orz

多維動態規劃裏面的題orz

簡化問題為從一個方向傳兩張紙條 所以用四維數組。

狀態轉移方程:

\(f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i][j-1][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k][l-1])+map[i][j]+map[k][l]\)

#include<iostream>
#include<cstdio>
using namespace std;
int m,n,x,y,val,f[51][51][51][51],map[51][51];
int main(){
    scanf("
%d%d",&m,&n); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) for(int l=1;l<=n;l++){ f[i][j][k][l]=max(f[i-1
][j][k-1][l],max(f[i][j-1][k-1][l],max(f[i-1][j][k][l-1],f[i][j-1][k][l-1])))+map[i][j]+map[k][l]; if(i==k&&j==l)f[i][j][k][l]-=map[i][j]; } printf("%d\n",f[m][n][m][n]); return 0; }

Luogu 1006 傳紙條