code1043 方格取数
第一次走用dfs枚举每种情况,第二次走用dp求剩下的最大值
设一个点集q用来保存有价值的点,排序,在最后加一个终点:x=m+1,y=m+1,v=0 //m是矩阵长宽
因为v=0的点是没有意义的,所以忽略它们,用q进行dfs
设当前点在q中的下标为p,已经积累的分数为score:
for(int i=p+;i<=n+;i++){
    if(q[i].y>=q[p].y){//可以到达
        a[q[i].x][q[i].y]=;
        dfs(i,score+q[i].v);
        a[q[i].x][q[i].y]=q[i].v;
    }
}
当p=n+1时,到了终点(n是有价值点的个数,n+1为最后添加的终点)
在残缺的a中dp找到第二次的最大价值,更新ans即可
代码如下:
#include<iostream>
#include<algorithm>
using namespace std; struct Point{
int x,y;
int v;
}q[];
bool cnt(Point c,Point d){
return c.x<d.x || (c.x==d.x && c.y<d.y);
}
int n,m;//m是边长,n是有值的点的个数
int a[][];
int d[][];
int ans=; int dp(){
for(int i=;i<=m;i++){
for(int j=;j<=m;j++){
d[i][j]=max(d[i-][j],d[i][j-])+a[i][j];
}
}
return d[m][m];
} void dfs(int p,int score){
if(p==n+){
int c=dp();
if(ans<c+score)ans=c+score;
return;
}
for(int i=p+;i<=n+;i++){
if(q[i].y>=q[p].y){//可以到达
a[q[i].x][q[i].y]=;
dfs(i,score+q[i].v);
a[q[i].x][q[i].y]=q[i].v;
}
}
} int main(){
cin>>m;
for(n=;true;n++){
cin>>q[n].x>>q[n].y>>q[n].v;
if(q[n].x==){n--;break;}
a[q[n].x][q[n].y]=q[n].v;
}
sort(q+,q+n+,cnt);
q[n+].x=m+;q[n+].y=m+;q[n+].v=;//终点
dfs(,);
cout<<ans<<endl; return ;
}
如果你看着那个a和q有点重复不爽,可以试着直接在q上dp,这样就可以省去a了
ps:code上用operator为什么编译不过去!!求解!!
code1043 方格取数的更多相关文章
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
		
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
 - NOIP200003方格取数
		
NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...
 - vijos 1563 疯狂的方格取数
		
P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签] 背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...
 - [HDU 1565+1569] 方格取数
		
HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
 - 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
		
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
 - HDU-1565                             方格取数(1)
		
http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Me ...
 - BZOJ 1475: 方格取数( 网络流 )
		
本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...
 - [动态规划]P1004 方格取数
		
---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...
 - P2045 方格取数加强版
		
P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...
 
随机推荐
- laravel的model例子
			
5里面直接artisan建立model ./artisan make:model MyModel 找到MyModel,改成下面这样 <?php namespace App; use Illumi ...
 - 0基础自学php教程
			
轻松搞定网页设计之html 一.HTML介绍 1. HTML概念 HTML(Hyper Text Markup Language),即超文本标记语言.是目前网络上应用最为广泛的语言,是构成网页文档的主 ...
 - 27 mysql主从出现错误
			
大多数的互联网应用场景都是读多写少,在发展过程中可能会出现读性能问题,在数据库层解决读性能问题:一主多从 下面是多主从结构 虚线箭头表示主备关系,A与A’互为主备,从库B,C,D指向主库A,一主多从的 ...
 - python学习(二十) Python 中的比较:is 与 ==
			
Python 中的比较:is 与 == 在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象 ...
 - 【POJ】1061 青蛙的约会 / 【BZOJ】1477(扩欧)
			
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 119148 Accepted: 25070 Descript ...
 - Shift Operations on C
			
The C standard doesn't precisely define which type of right shift should be used. For unsigned data, ...
 - 5.docker学习之容器
			
容器创建 我们已经知道,镜像是只读的,而基于镜像创建出来的容器是可读写的,所以,一般我们实际中,会经常使用对应镜像创建容器并且使用这些容器.同样,如果我们想要使用容器,那么我们必须首先需要创建容器.而 ...
 - 十年Java架构师分享
			
看到一篇十年java架构师分享需要掌握的技术点,有时间对照一下,好好学习一下. ------------------------------------------------------------ ...
 - win7 wifi
			
win7 wifi the settings saved on this computer for the network do not match the requirements of the n ...
 - 变体类型 Variant VARIANT
			
变体类型 Variant VARIANT class RTL_DELPHIRETURN Variant: public TVarData typedef struct tagVARIANT V ...