博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nyoj 1208——水题系列——————【dp】
阅读量:4959 次
发布时间:2019-06-12

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

水题系列

时间限制:
1000 ms  |  内存限制:65535 KB
难度:
2
 
描述
    给你一个有向图,每条边都有一定的权值,现在让你从图中的任意一点出发,每次走的边的权值必须必上一次的权值大的情况下,问你最多能走几条边?
 
输入
首先一个n和m,分别表示点的数目和边的数目
接下来m行,每行三个值x,y,val,表示x到y有路,其权值为val。(1<n,m,val<10^5,0<x,y<=n)
输出
输出最多有的边的数目
样例输入
3 31 2 12 3 13 1 16 71 2 13 2 52 4 22 5 22 6 95 4 34 3 4
样例输出
16 解题思路:这个题目刚看起来好像是图论,但是出题人是考察的dp思想。定义两个数组dp[i],g[i]分别表示边编号为i时的最多有向边及点为i时的最多有向边数目。转移方程为:       如果边权不相同:dp[i]=g[E[i].st]+1,g[E[i].en]=max(g[E[i].en],dp[i])。       如果边权相同:{i,i+1,i+2,i+3...}边集合中都为边权相同的边编号。              dp[i]=g[E[i].st]+1,dp[i+1]=g[E[i+1].st]+1,etc...              g[E[i].en]=dp[i],g[E[i+1].en]=dp[i+1],etc...              对于边权相同的情况,第一组样例可以看出问题,这里这种操作学长说是延迟,具体说应该是对点延迟,对边提前。
#include
using namespace std;const int maxe=1e5+10;struct edge{ int st,en; int val;}E[maxe];int dp[maxe],g[maxe];int INF=1e9;bool cmp(edge a,edge b){ return a.val
max_e){// max_e=g[i];// }// } for(int i=0;i

  

转载于:https://www.cnblogs.com/chengsheng/p/4479239.html

你可能感兴趣的文章
9、总线
查看>>
Git 笔记 - section 1
查看>>
HDU6409 没有兄弟的舞会
查看>>
2018 Multi-University Training Contest 10 - TeaTree
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
《人人都是产品经理》书籍目录
查看>>
如何在git bash中运行mysql
查看>>
OO第三阶段总结
查看>>
构建之法阅读笔记02
查看>>
DataTable和 DataRow的 区别与联系
查看>>
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
查看>>
mysql数据库中数据类型
查看>>
Fireworks基本使用
查看>>
两台电脑间的消息传输
查看>>
Linux 标准 I/O 库
查看>>
.net Tuple特性
查看>>
Java基础常见英语词汇
查看>>
iOS并发编程笔记【转】
查看>>
08号团队-团队任务5:项目总结会
查看>>