当时区域赛的一道题。题意大概是这样的,有一个1~N的图,然后你要从1-》N,其中每经过一条边需要消耗你的时间和金钱,每到一个地方可以选择什么都不做,或者买一包盐,卖一包盐,身上不能同时有超过B包盐,然后你还可以从当前所在的世界i转道(i+1)modK的世界,每次转换花费时间1,然后问你在T时间内到达n点的时候你最多能有多少钱。 那个时候不会做是因为不知道如何控制dp的方向,我记得那个时候我已经把状态写好了,转移也是知道的,就是不知道转移的方向,后来发现时间的那一维是降的,于是我们就可以建一个优先队列,把一开始的状态压进去,然后拓展新的状态,这样就可以做出来了,调了很久,因为我心里认为它是无向图。。。。。吸取教训呀要!

#pragma warning(disable:4996)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<cmath>
#define maxn 150
using namespace std; int n, m, B, K, R, T; int p[6][maxn]; struct Edge
{
int u, v, t, m;
Edge(){}
Edge(int ui, int vi, int ti, int mi) :u(ui), v(vi), t(ti), m(mi){}
}; vector<Edge> G[maxn]; int dp[6][maxn][5][250]; // dp[K][N][B][T] k维空间,第n个点,有b袋盐,剩余时间为T时的最多有多少钱
bool vis[6][maxn][5][250];
struct Node
{
int k, n, b, t;
Node(){}
Node(int ki, int ni, int bi, int ti) :k(ki), n(ni), b(bi), t(ti){}
bool operator < (const Node X) const{
return t < X.t;
}
}; int main()
{
int cas; cin >> cas; int ca = 0;
while (cas--)
{
scanf("%d%d%d%d%d%d", &n, &m, &B, &K, &R, &T);
for (int i = 0; i < K; i++){
for (int j = 1; j <= n; j++){
scanf("%d", &p[i][j]);
}
}
for (int i = 0; i <= n; i++) G[i].clear();
int ui, vi, ti, mi;
for (int i = 0; i < m; i++){
scanf("%d%d%d%d", &ui, &vi, &ti, &mi);
G[ui].push_back(Edge(ui, vi, ti, mi));
}
memset(dp, -1, sizeof(dp));
memset(vis, 0, sizeof(vis));
dp[0][1][0][T] = R;
vis[0][1][0][T] = true;
priority_queue<Node> que;
que.push(Node(0, 1, 0, T));
while (!que.empty()){
Node nxt = que.top(); que.pop();
if (nxt.k == 0 && nxt.n == n) continue;
int val = dp[nxt.k][nxt.n][nxt.b][nxt.t];
for (int i = 0; i < G[nxt.n].size(); i++){
Edge vv = G[nxt.n][i];
if (nxt.k != 0 && (vv.v == 1 || vv.v == n)) continue;
if (nxt.t >= vv.t&&val >= vv.m){
dp[nxt.k][vv.v][nxt.b][nxt.t - vv.t] = max(dp[nxt.k][vv.v][nxt.b][nxt.t - vv.t], val - vv.m);
if (!vis[nxt.k][vv.v][nxt.b][nxt.t - vv.t]){
que.push(Node(nxt.k, vv.v, nxt.b, nxt.t - vv.t));
vis[nxt.k][vv.v][nxt.b][nxt.t - vv.t] = true;
}
if (vv.v == 1 || vv.v == n) continue;
if (nxt.b < B && (val - vv.m) >= p[nxt.k][vv.v]){
dp[nxt.k][vv.v][nxt.b + 1][nxt.t - vv.t] = max(dp[nxt.k][vv.v][nxt.b + 1][nxt.t - vv.t],
val - vv.m - p[nxt.k][vv.v]);
if (!vis[nxt.k][vv.v][nxt.b + 1][nxt.t - vv.t]){
que.push(Node(nxt.k, vv.v, nxt.b + 1, nxt.t - vv.t));
vis[nxt.k][vv.v][nxt.b + 1][nxt.t - vv.t] = true;
}
}
if (nxt.b>0){
dp[nxt.k][vv.v][nxt.b - 1][nxt.t - vv.t] = max(dp[nxt.k][vv.v][nxt.b - 1][nxt.t - vv.t],
val - vv.m + p[nxt.k][vv.v]);
if (!vis[nxt.k][vv.v][nxt.b - 1][nxt.t - vv.t]){
que.push(Node(nxt.k, vv.v, nxt.b - 1, nxt.t - vv.t));
vis[nxt.k][vv.v][nxt.b - 1][nxt.t - vv.t] = true;
}
}
}
}
if (nxt.t < 1) continue;
if (nxt.n == 1 || nxt.n == n) continue;
dp[(nxt.k + 1) % K][nxt.n][nxt.b][nxt.t - 1] = max(dp[(nxt.k + 1) % K][nxt.n][nxt.b][nxt.t - 1],
val);
if (!vis[(nxt.k + 1) % K][nxt.n][nxt.b][nxt.t - 1]){
que.push(Node((nxt.k + 1) % K, nxt.n, nxt.b, nxt.t - 1));
vis[(nxt.k + 1) % K][nxt.n][nxt.b][nxt.t - 1] = true;
}
if (nxt.b < B&&val >= p[(nxt.k + 1) % K][nxt.n]){
dp[(nxt.k + 1) % K][nxt.n][nxt.b + 1][nxt.t - 1] = max(dp[(nxt.k + 1) % K][nxt.n][nxt.b + 1][nxt.t - 1],
val - p[(nxt.k + 1) % K][nxt.n]);
if (!vis[(nxt.k + 1) % K][nxt.n][nxt.b + 1][nxt.t - 1]){
que.push(Node((nxt.k + 1) % K, nxt.n, nxt.b + 1, nxt.t - 1));
vis[(nxt.k + 1) % K][nxt.n][nxt.b + 1][nxt.t - 1] = true;
}
}
if (nxt.b>0){
dp[(nxt.k + 1) % K][nxt.n][nxt.b - 1][nxt.t - 1] = max(dp[(nxt.k + 1) % K][nxt.n][nxt.b - 1][nxt.t - 1],
val + p[(nxt.k + 1) % K][nxt.n]);
if (!vis[(nxt.k + 1) % K][nxt.n][nxt.b - 1][nxt.t - 1]){
que.push(Node((nxt.k + 1) % K, nxt.n, nxt.b - 1, nxt.t - 1));
vis[(nxt.k + 1) % K][nxt.n][nxt.b - 1][nxt.t - 1] = true;
}
}
}
int ans = -1;
for (int i = 0; i <= B; i++){
for (int j = 0; j <= T; j++){
ans = max(ans, dp[0][n][i][j]);
}
}
printf("Case #%d: ", ++ca);
if (ans == -1) puts("Forever Alone");
else printf("%d\n", ans);
}
return 0;
}

HDU4784 Dinner Coming Soon(dp)的更多相关文章

  1. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  2. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  3. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  4. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  5. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  6. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  7. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

  8. Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)

    Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...

  9. 最长公共子序列长度(dp)

    /// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...

随机推荐

  1. 界面控件 - 滚动条ScrollBar

    界面是人机交互的门户,对产品至关重要.在界面开发中只有想不到没有做不到的,有好的想法,当然要尝试着做出来.对滚动条的扩展,现在有很多类是的例子. VS2015的代码编辑是非常强大的,其中有一个功能可以 ...

  2. DTW

    DTW主要是应用在孤立词识别的算法,用来识别一些特定的指令比较好用,这个算法是基于DP(动态规划)的算法基础上发展而来的.这里介绍语音识别就先介绍下语音识别的框架,首先我们要有一个比对的模版声音,然后 ...

  3. Redbean:入门(一) - 增删改查

    <?php require_once 'rb.php'; $tableName = "link"; //链接数据库 R::setup("mysql:host=loc ...

  4. 关于ios极光推送server端注意的地方

    今天试用了极光推送API 用它是因为,大多数人说它的文档是最全的,但是用过之后,发现关于IOS的文档,还是很不够,导致走了一点弯路! 特别是服务端的代码:https://github.com/jpus ...

  5. 在HTML中添加目录

    <a href="#num1">跳转到第一章</a><div id="num1">第一章</div>用a的hre ...

  6. swift 基于SDK8.0 获取当前时间

    var date = NSDate.date() var timeFormatter = NSDateFormatter() timeFormatter.dateFormat = "MM-d ...

  7. [转]分布式文件系统FastDFS架构剖析

    [转]分布式文件系统FastDFS架构剖析 http://www.programmer.com.cn/4380/ 文/余庆 FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实 ...

  8. LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)

    当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...

  9. vhdl基础---分频

    偶数分频 ibrary IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_arith; use ieee.std_logic_unsigned ...

  10. VBS数组函数学习实例分析

    Array 函数 返回包含数组的Variant. Array(arglist) 参数:arglist是赋给包含在Variant中的数组元素的值的列表(用逗号分隔).如果没有指定此参数,则将会创建零长度 ...