第一次走用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 方格取数的更多相关文章

  1. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. NOIP200003方格取数

    NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...

  3. vijos 1563 疯狂的方格取数

    P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签]   背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...

  4. [HDU 1565+1569] 方格取数

    HDU 1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)

      HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...

  6. HDU-1565 方格取数(1)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Me ...

  7. BZOJ 1475: 方格取数( 网络流 )

    本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...

  8. [动态规划]P1004 方格取数

    ---恢复内容开始--- 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 ...

  9. P2045 方格取数加强版

    P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...

随机推荐

  1. STM32的启动过程分析

    对于stm32的启动过程一直心存疑惑.今天找了很多资料,进行了一个大致的分析. 1.cortex M3的复位过程(来自官方资料) 上述开机启动流程比较详细,内容较为全面,但部分步骤可以省略(红字可省略 ...

  2. MQTT 协议 Client ID 长度不能超过23个字符

    今天遇到一个MQTT的问题,MqttException: MQIsdp ClientId > 23 bytes ClientId的长度大于23时,无法链接MQTT服务器. 经过查看协议发现:客户 ...

  3. php端安装rabbitmq-c

    php端安装rabbitmq-c url:https://github.com/alanxz/rabbitmq-c cd rabbitmq-c**** ./configure --prefix=/us ...

  4. (转)JavaMail中的Flag(邮件状态)

    本文转载自:http://blog.csdn.net/chjttony/article/details/6005594 标记邮件就是把邮件标记为已读,删除等操作,需要使用Flags类,它mail.ja ...

  5. one2many &&many2many

    只记录双向的情况(双向是单向的一种)  @OneToMany 和 @ManyToOne :一个Group 包含多个 User; Group.class package com.XX.model; im ...

  6. 02:Sysbench基准压测(oltp_update_index.lua、oltp_update_non_index.lua)my.cnf

    目录 Sysbench 基准压测 my.cnf 一.Sysench测试前准备 1.1.压测环境 二.进行OLTP_update测试 2.1.安装压测工具sysbench 2.2.执行压测 三.执行结果 ...

  7. apk比较版本大小

    Java String.compareTo(), 此方法如果这个字符串是等参数字符串那么​返回值0,如果这个字符串是按字典顺序小于字符串参数那么返回小于0的值, 如果此字符串是按字典顺序大于字符串参数 ...

  8. Android利用百度云来识别身份证及各种证件的信息

    上一篇中我已经介绍过了ocr,及google出来的tess-two的使用. 接下来我来介绍一个更方便的身份证识别系统,当然它本身也是利用ocr来识别文字的,不过它处理的更好,可以为我们提供更快,更准确 ...

  9. JavaScript中的可枚举属性与不可枚举属性

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的.可枚举性决定了这个属性能否被for…in查找遍历到. 一.怎么判断属性是否可枚举 js中基本包 ...

  10. JavaScript知识总结--历史-html引用方式-基础概念

    一.JavaScript简介 1.ECMAScript 1995~今已经20年的历史,产生JavaScript是需要它去解决一定的问题:在浏览器端做一些数据的验证,试想当年的网络环境,如果能够在浏览器 ...