1. 程式人生 > >洛谷P1004 方格取數 dp

洛谷P1004 方格取數 dp

這一題相當於兩個人從左上角走到右上角

dp[i][j][k][l]表示第一個人走到(i,j)第二個人走到(k,l)時取到數總和的最大值

dp[i][j][k][l]=max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])+a[i][j]+a[k][l]

如果i==k,j==l時應該再減去a[i][j](每個位置的數只能取一次)

#include<iostream>
using namespace std;
int dp[11][11][11][11];//dp[i][j][k][l]表示第一個人走到(i,j)第二個人走到(j,k)時取走數的最大值
int n,b,c,d,a[11][11]; int maxx(int a,int b,int c,int d) { a=max(a,b);a=max(a,c);a=max(a,d); return a; } void solve() { int i,j,k,l; cin>>n; while(1) { cin>>b>>c>>d; if(b==0&&c==0&&d==0)break; a[b][c]=d; }
for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) for(l=1;l<=n;l++) { dp[i][j][k][l]=maxx(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l], dp[i][j-1][k][l-1])+a[i][j]+a[k][l];
if(i==k&&j==l)dp[i][j][k][l]-=a[i][j]; } cout<<dp[n][n][n][n]<<endl; } int main() { solve(); }