博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
方格取数
阅读量:5253 次
发布时间:2019-06-14

本文共 2221 字,大约阅读时间需要 7 分钟。

题目链接http://noi.openjudge.cn/ch0206/8786/

描述

设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示(见样例):< p="">

某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。

 

输入输入的第一行为一个整数N(表示N*N的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的0表示输入结束。输出只需输出一个整数,表示2条路径上取得的最大的和。样例输入

82 3 132 6 63 5 74 4 145 2 21 5 6 46 3 157 2 140 0 0

样例输出

67

来源NOIP2000复赛 提高组 第四题

(WA)原来想先取一次最优解,更新后,再去一次最优解。发现过不了。这是一种贪心,这两个局部最优解不一定是整体最优解。可能两个局部最优解不可能把整个带数的格子取完,但整体最优解可以。

(AC)   后来查了一下,发现这个是一个多线程DP,同时模拟两个人走。

       dp[i][j][k][r]表示第一个人走到(i,j),第二个人走到(k,r)的最优解。其可由max(dp[i-1][j][k-1][r],dp[i][j-1][k][r-1]),dp[i][j-1][k-1][r],max(dp[i-1][j][k][r-1]) + {maps[i][j](两个人位置重合时)或 maps[i][j]+maps[k][r](两个人位置不重合时)}转移而来。

WA:

#include
#include
#include
#include
#include
#include
#include
#define DEBUG(x) cout<<#x<<" = "<
<
Len[i][j+1])dfs(i+1,j,l-Matrix[i][j]); else dfs(i,j+1,l-Matrix[i][j]); if(Len[i][j]==l&&Matrix[i][j]!=0){ Matrix[i][j]=0; }}int main(){ scanf("%d",&N); int ans=0; while(true){ int i,j,v; scanf("%d%d%d",&i,&j,&v); if(i==0)break; Matrix[i][j]=v; } Len[N][N]=Matrix[N][N]; for(int k=N-1;k>=1 ;k-- ){ Len[N][k]+=Len[N][k+1]; Len[k][N]+=Len[k+1][N]; } for(int i=N-1;i>=1 ;i-- ){ for(int j=N-1;j>=1 ;j-- ){ Len[i][j]=max(Len[i][j+1],Len[i+1][j])+Matrix[i][j]; } } dfs(1,1,Len[1][1]); ans=Len[1][1]; memset(Len,0,sizeof(Len)); Len[N][N]=Matrix[N][N]; for(int k=N-1;k>=1 ;k-- ){ Len[N][k]+=Len[N][k+1]; Len[k][N]+=Len[k+1][N]; } for(int i=N-1;i>=1 ;i-- ){ for(int j=N-1;j>=1 ;j-- ){ Len[i][j]=max(Len[i][j+1],Len[i+1][j])+Matrix[i][j]; } } ans+=Len[1][1]; printf("%d\n",ans);}
View Code

AC:

#include
#include
#include
#include
#include
#include
#include
#define DEBUG(x) cout<<#x<<" = "<
<
View Code

还有一个问题比较迷,为什么是从这四个状态转移过来的dp[i-1][j][k-1][r],dp[i][j-1][k][r-1]),dp[i][j-1][k-1][r],max(dp[i-1][j][k][r-1]?

参考文献

https://blog.csdn.net/heyanbai/article/details/79519532

转载于:https://www.cnblogs.com/MalcolmMeng/p/9200935.html

你可能感兴趣的文章
Kontln的属性形式Getter和Setter
查看>>
win10 bcdedit加入vhdx启动
查看>>
Linux 黑白界面显示
查看>>
ActiveMQ学习系列(四)----消息持久化到mysql
查看>>
JavaScript设计模式基础之面向对象的JavaScript(一)
查看>>
RabbitMQ-从基础到实战(4)— 消息的交换(中)
查看>>
mysql 索引数据结构及原理
查看>>
01.Hibernate入门
查看>>
Ubuntu 16.0.4开启 log-bin
查看>>
mongoDB的学习【小白的福音】
查看>>
软件工程的实践项目的自我目标
查看>>
sql server日期时间转字符串
查看>>
经典排序算法(PHP)
查看>>
Spring boot中Spring-Data-JPA操作MySQL数据库时遇到的错误(一)
查看>>
django实现SSO
查看>>
adidas crazylight 2018 performance analysis review
查看>>
influxDb数据备份
查看>>
手动创建一张表
查看>>
算法与并行计算(世界著名计算机教材精选)
查看>>
centos7 网络不通
查看>>