cf 459E DP
2014-08-16 03:31
155 查看
我这水逼,dp搞不出来,艹
题目意思很简单
然后首先我们把所有的边按照重量来排序,然后dp【i】表示边i向前的最大值
然后n^2的算法是不行的
然后我们就用个map来记录前面比i的重量大的边且起点为u的最大值(这样就不用遍历来找最大值)
AC代码如下:
题目意思很简单
然后首先我们把所有的边按照重量来排序,然后dp【i】表示边i向前的最大值
然后n^2的算法是不行的
然后我们就用个map来记录前面比i的重量大的边且起点为u的最大值(这样就不用遍历来找最大值)
AC代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct Edge{ int u, v, w; }; Edge edge[3*110000]; int N, M; __int64 dp[3*110000]; __int64 mp[3*110000]; bool cmp( Edge a, Edge b ){ if( a.w > b.w ){ return true; }else{ return false; } } int main(){ while( scanf( "%d%d", &N, &M ) != EOF ){ for( int i = 1; i <= M; i++ ){ scanf( "%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w ); } sort( edge + 1, edge + 1 + M, cmp ); memset( dp, 0, sizeof( dp ) ); memset( mp, 0, sizeof( mp ) ); __int64 ans = 0; int j = 1; for( int i = 1; i <= M; i++ ){ while( j < i && edge[j].w > edge[i].w ){ mp[edge[j].u] = max( mp[edge[j].u], dp[j] ); j++; } dp[i] = mp[edge[i].v] + 1; ans = max( ans, dp[i] ); } printf( "%I64d\n", ans ); } return 0; }
相关文章推荐
- cf 6a Triangle
- 第一次参加CF的Round
- CF 460B Little Dima and Equation
- CF 400 div2
- ARC下OC对象和CF对象之间的桥接(bridge)
- 推荐系统学习--cb+cf 初见
- [CFString retain]: message sent to deallocated instance”
- cf:数值进制计算
- CF- Day at the Beach
- CF 599D Spongebob and Squares(数学)
- CF 605A(Sorting Railway Cars-贪心)
- CF# Educational Codeforces Round 3 A. USB Flash Drives
- CF 610E. Alphabet Permutations
- cf 337 div2 c
- cf 616A Comparing Two Long Integers
- Geometric Progression---cf 567C(求组合方式,map离散)
- CF 17B Hierarchy
- cf 372A Counting Kangaroos is Fun
- CF 633B:A Trivial Problem
- cf#ECR 9-C - The Smallest String Concatenation-水题