前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(c#解法)题解洛谷P1004(c++解法)方格取数

(c#解法)题解洛谷P1004(c++解法)方格取数

作者头像
w4979的博客
发布2020-06-01 11:21:15
5160
发布2020-06-01 11:21:15
举报
文章被收录于专栏:随笔记录随笔记录

①先看一下出题日期(毕竟是NOIP的题目,有一定的水准),然后发现是2000年的普及第四题

我们要知道的是,好像比较前面的几年由于1999的数塔IOI问题后,接下来几年的最后一两题都很喜欢出DP

所以,我们首先看一下题目的内容,求路径最大的方法,这时候就要想到DP或者DFS

②然后我们发现题目的数据规模不大,n<=9,所以我们可以考虑用DFS或者DP都可以

但是鉴于 "好像比较前面的几年由于1999的数塔IOI问题后,接下来几年的最后一两题都很喜欢出DP "

我们觉得用DP会比较好

③而且,NOIP的压轴DP题你想要2维过(在考场上是很难想出来的)

所以我们考虑高维

④我们找到一个东西叫做四维DP,因为这题是两个人走,我们思考一下能不能单纯用两个人的模拟过a呢?

显然是可以的,我们记f[i][j][k][l]表示第1条路线的i,j走法和第2条路线的k,l走法

显然我们可以两个人一起走,复杂度最多就是999*9=6561(哈哈哈时间复杂度这么低)

所以我们就用这个方法了!

⑤然后我们思考动归方程的写法:

第1条路线只可能是从i-1,j或者i,j-1转移,第2条路线也只可能从k-1,l或者k,l-1转移

而且因为是2个人走,如果走到一点我们的那个点就要打标记说那点上面的值为0

所以我们得到了我们的动归方程(注意:万一i,j与k,l相同这是要小心的!)

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])+a[i][j]+a[k][l]; 1 代码如下:

代码语言:javascript
复制
#include<bits/stdc++.h>
 using namespace std;
 int n,x,y,val,ans=0,maxn,f[12][12][12][12],a[12][12];//a[i][j][k][l]表示两个人同时走,一个走i,j 一个走k,l
 int main(){
 scanf("%d",&n);
 memset(a,0,sizeof a);
 while(1){
 scanf("%d%d%d",&x,&y,&val);
 if(x0&&y0&&val0)break;
 a[x][y]=val;
 }
 for(int i=1;i<=n;i++){
 for(int j=1;j<=n;j++){
 for(int k=1;k<=n;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])))+a[i][j]+a[k][l];
 if(ik&&j==l)f[i][j][k][l]-=a[i][j];
 }
 }
 }
 }
 printf("%d\n",f[n][n][n][n]);
 return 0;
 }

————————————————

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档