Luogu P1004 [NOIP2000]方格取数

来源:互联网 发布:农村选举知乎 编辑:程序博客网 时间:2024/06/05 20:59

题目传送门:https://www.luogu.org/problem/show?pid=1004


这道题是NOIP2000TG的T4。


主要思路:这道题可以用DP,i和j是第一个人的位置,k和l是第二个人的位置.用dp[i][j][k][l]来表示两个人站在这两个位置上所能取的最大数.到(x,y)只能从(x-1,y)和(x,y-1)这两个位置走上来,所以有四种可能,所以我们可以得出一个状态转移方程:
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],然后再加上(i,j),(k,l)自带的数,如果这两个位置相等,那么再除以二,这么一来dp[i][j][k][l]的值就算出来了。


附上代码:

#include <iostream>using namespace std;int n,x,y,z,map[10][10],dp[10][10][10][10],i,j,k,l,sum1,sum2,sum3;int main(){cin>>n;while(1){cin>>x>>y>>z;if(x==0 && y==0 && z==0)break;map[x][y]=z;}for(i=1;i<=n;i++){for(j=1;j<=n;j++){for(k=1;k<=n;k++){for(l=1;l<=n;l++){sum1=max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1]);sum2=max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]);sum3=map[i][j]+map[k][l];if(i==k && j==l){sum3/=2;}sum3+=max(sum1,sum2);dp[i][j][k][l]=sum3;}}}}cout<<dp[n][n][n][n];return 0;}

原创粉丝点击