urumuqi H skiing DP

  题目链接: 一如既往的没有啊 老哥

  题目描述: 给以一个有向图, 每个边上有权值, 问你一条通路的最大权值是多少

  解题思路: 这道题应该很裸吧,......自己记得以前做过啊,  自己写崩了, 明天早起去看看紫书, 那里我记得是有的啊

  代码: 刚才自己总算调出来了, 自己写过的东西怎么忘得这么快啊......

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <queue>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define sca(x) scanf("%d",&x)
#define de printf("=======\n")
typedef long long ll;
using namespace std;
const ll t = 1e8;

const int maxn = 1e4+100;
map<pair<int, int>, int> p;
int d[maxn]; // d[i] 表示i号节点为起点的最长距离为d[i]
int isend[maxn];
int n, m;

int dfs( int index ) {
    if( isend[index] ) return 0;
    for( int i = 1; i <= n; i++ ) {
        if( i != index ) {
            int dis = p[make_pair(index, i)];
            if( dis ) {
                d[index] = max( d[index], dis + dfs(i) );
            }
        }
    }
    return d[index];
}
int main() {
    int t;
    sca(t);
    while( t-- ) {
        scanf( "%d%d", &n, &m );
        p.clear();
        mem0(d);
        mem0(isend);
        for( int i = 1; i <= m; i++ ) {
            int s, e, l;
            scanf( "%d%d%d", &s, &e, &l );
            p.insert(make_pair(make_pair(s, e), l));
            isend[s] = 0;
            isend[e] = 1;
        }
        int ans = 0;
        for( int i = 1; i <= n; i++ ) {
            ans = max( ans, dfs(i) );
        }
        printf( "%d\n", ans );
    }
    return 0;
}

  思考: 记性太差啦, 以后得每天一道数据结构了, 毕竟数据结构太重要了, 今天是不是又没写面试总结啊......... 然后自己关于这个程序是怎么写的还是有疑问的, 明天参照紫书, 然后自己仔细看看自己的程序, 别不长记性。

时间: 2024-10-16 02:49:36

urumuqi H skiing DP的相关文章

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing

题意:在这个寒假中,鲍勃有计划在山区度假胜地滑雪.这个滑雪胜地有M个不同的滑雪道和N个不同的标志位于那些转弯处点.从第S标记到第T标志的第i路径具有长度L.每个路径必须遵循降低高度的原则,起点必须严格高于终点. 现在,你应该帮助鲍勃找到最长的滑雪道. 思路:因为说起点必须严格高于终点,所以是一个有向图,而且不可能存在环,可以看作是一个DAG模型, 求DAG上的最长路可以用dp来求,有些时候也可以看作AOE网,这样就可以用拓扑排序来求关键路径来解决了: 代码: #include<algorithm

BZOJ 1592: [Usaco2008 Feb]Making the Grade 路面修整( dp )

最优的做法最后路面的高度一定是原来某一路面的高度. dp(x, t) = min{ dp(x - 1, k) } + | H[x] - h(t) | ( 1 <= k <= t ) 表示前 i 个路面单调不递减, 第 x 个路面修整为原来的第 t 高的高度. 时间复杂度O( n³ ). 令g(x, t) = min{ dp(x, k) } (1 <= k <= t), 则转移O(1), g() 只需在dp过程中O(1)递推即可, 总时间复杂度为O( n² ) 然后单调不递增也跑一遍

BZOJ 1564: [NOI2009]二叉查找树( dp )

树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 : dp(l, r, v) = min( dp(l, m-1, v) + dp(m+1, r, v) + p(l~r) + K ) 不修改(m原先权值≥v) : dp(l, r, v) = min( dp(l, m-1, Value(m)) + dp(m+1, r, Value(m)) + p(l~

HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1506 Appoint description: Description A histogram is a polygon composed of a sequence of rectangles aligned a

BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )

简单的dp.. dp(i,j) = max(dp(x,y))+cnt[i][j], (x,y)->(i,j)是合法路径. 设f(i)= max(dp(x,y))(1≤x≤N, 1≤y≤i), g(i,j) = max(dp(i, k))(1≤k≤j) 那么dp(i,j) =  max(f(j+delta), g(i,j+1))+cnt[i][j]. 递推即可. 时间复杂度O(NH) ---------------------------------------------------------

BZOJ 1087: [SCOI2005]互不侵犯King( 状压dp )

简单的状压dp... dp( x , h , s ) 表示当前第 x 行 , 用了 h 个 king , 当前行的状态为 s . 考虑转移 : dp( x , h , s ) = ∑ dp( x - 1 , h - cnt_1( s ) , s' ) ( s and s' 两行不冲突 , cnt_1( s ) 表示 s 状态用了多少个 king ) 我有各种预处理所以 code 的方程和这有点不一样 ------------------------------------------------

Codeforces Round #145 (Div. 1, ACM-ICPC Rules)B dp

///dp[i][j][0] 表示前i列涂了j个red且第j列是red得到最少的valul //dp[i][j][1]表示第i列涂了j个red且第j列是green得到的最少的value //dp[i][j][0] = min(dp[i-1][j-h[i]][0] , dp[i][j][1] + min(h[i-1] ,h[i])) //dp[i][j][1] = min(dp[i-1][j][0] + min(h[i-1],h[i]) ,dp[i][j][1]) #include<cstdio>

CodeForces 268D a nice dp

//先贴一发错误的代码,dp[层数][方向] //因为是对不完整的方案计数了... 1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 using namespace std; 6 const __int64 mod = 1e9 + 9; 7 __int64 dp[1010][5]; 8 int n, h

BZOJ 3209: 花神的数论题【数位dp】

Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了.花神的题目是这样的设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你派(Sum(i)),也就是 sum(1)—sum(N) 的乘积. Input 一个正整数 N. Output 一个数,答案模 10000007 的值. Sample Input 样例输入一3 S