UVa 1628 Pizza Delivery

题目:

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51189

思路:

  本体与修缮长城一题有所相似。所以解法有相似之处。

不同之处就是本体可能会产生负情况,即送餐时间晚了客户会反过来找你要钱所以需要放弃,但修缮长城只有费用,顺手修了肯定是一个不错的选择。

依旧将区间两端与位置作为状态不过要添加一维cnt表示还需要送餐的人数。类似地定义:d[i][j][cnt][p]表示已经送完了ij区间(区间内或送餐或放弃)位于p(p==0||p==1)还剩下cnt个客户需要继续送餐。添加的一维成功解决了不知道还有多少的客户需要送餐的问题。这里注意到DP过程中利用的信息都来源于状态,因此定义的状态必须要提供转移足够的信息,这样才能得到所需要的值。

转移方程:

d[i][j][cnt][p]=max{d[i][k][cnt-1][1]+pay[knew]//k在余下的右区间  ,  d[k][j][cnt-1][0] +pay[knew]//k在余下的左区间}

代码:

  1. // UVa1628 Pizza Delivery
  2. // Rujia Liu
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. const int maxn = + ;
  9.  
  10. int kase, n;
  11. int p[maxn], v[maxn];
  12. int d[maxn][maxn][maxn][];
  13. int vis[maxn][maxn][maxn][];
  14.  
  15. // already considered s~e, still need to delivery to cnt people.
  16. // pos = 0 means at s, pos = 1 means at e
  17. int dp(int s, int e, int cnt, int pos) {
  18. if(cnt == ) return ; //cnt==0 return
  19.  
  20. int &ans = d[s][e][cnt][pos]; //记忆化搜索
  21. if(vis[s][e][cnt][pos] == kase) return ans;
  22. vis[s][e][cnt][pos] = kase;
  23.  
  24. ans = ;
  25. //枚举的i与之前区间相间的部分默认为不会送餐 //比较得出max_ans
  26. if(!pos) { //pos==s
  27. for(int i = ; i < s; i++) //s->i //i在区间的左边
  28. ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(i, e, cnt - , ));
  29. //ans=max(ans,足够已知的未来价值+子问题价值)
  30. for(int i = e + ; i < n; i++) //s->i //i在区间的右边
  31. ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(s, i, cnt - , ));
  32. }
  33. else { //pos==e
  34. for(int i = ; i < s; i++) //e->i //i在区间的左边
  35. ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(i, e, cnt - , ));
  36. for(int i = e + ; i < n; i++) //e->i //i在区间的右边
  37. ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(s, i, cnt - , ));
  38. }
  39. return ans;
  40. }
  41.  
  42. //DP要枚举出所有具有最优可能性的情况 不能遗漏否则问题就可能不是最优
  43.  
  44. int main() {
  45. int T;
  46. scanf("%d",&T);
  47. memset(vis, , sizeof(vis));
  48. for(kase = ; kase <= T; kase++) {
  49. scanf("%d", &n);
  50. for(int i = ; i < n; i++) scanf("%d", &p[i]); //位置[]
  51. for(int i = ; i < n; i++) scanf("%d", &v[i]); //原利[]
  52.  
  53. int ans = ;
  54. for(int k = ; k <= n; k++) //枚举送餐人数
  55. for(int i = ; i < n; i++) //枚举给送餐的第一个人
  56. ans = max(ans, v[i] - k * abs(p[i]) + dp(i, i, k - , )); //枚举比较 make_max
  57. printf("%d\n",ans);
  58. }
  59. return ;
  60. }

【暑假】[深入动态规划]UVa 1628 Pizza Delivery的更多相关文章

  1. Pizza Delivery

    Pizza Delivery 时间限制: 2 Sec  内存限制: 128 MB 题目描述 Alyssa is a college student, living in New Tsukuba Cit ...

  2. 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem

     UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...

  3. 【暑假】[深入动态规划]UVa 12170 Easy Climb

    UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路:  引别人一 ...

  4. 【暑假】[深入动态规划]UVa 10618 The Bookcase

    UVa 12099  The Bookcase 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=42067 思路:    ...

  5. 【暑假】[深入动态规划]UVa 10618 Fun Game

    UVa 10618 Fun Game 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36035 思路:   一圈人围坐 ...

  6. 【暑假】[深入动态规划]UVa 10618 Fixing the Great Wall

    UVa 10618 Fixing the Great Wall 题目:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=361 ...

  7. 【暑假】[深入动态规划]UVa 1627 Team them up!

    UVa 1627 Team them up! 题目: Team them up! Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Forma ...

  8. 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection

    UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to lea ...

  9. 【暑假】[深入动态规划]UVa 1412 Fund Management

    UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS   Memory Limit: Unknown   ...

随机推荐

  1. mysql 获取季度的第一天 本月的第一天,本周的第一天sql语句(转)

    感谢:http://www.111cn.net/database/110/d45124323da8d2d87b80f78319987eda.htm 查看同主题的另一篇博客:http://blog.cs ...

  2. 11个好用的jQuery拖拽拖放插件

    这次我们整理一些拖拽播放类型的jQuery插件,这些可能不是很常用,但偶尔会有网站设计项目用到,特别是后台相关的开发项目,这个拖放排序功能一般都会有,所以适合大家收藏起来,方便日后使用.接下来一起看盾 ...

  3. 关于ax+by=c的解x,y的min(|x|+|y|)值问题

    首先我们移动一下项,并强行让a>b. 然后我们可以画出这样一个图像 我们发现,在线段l与x轴交点处的下方,x,y的绝度值是递增的,所以我们不考虑那个最小点在下端. 之后我们发现在点的上端,因为斜 ...

  4. 配置单节点伪分布式Hadoop

    先写的这一篇,很多东西没再重复写. 一.所需软件 jdk和ubuntu都是32位的. 二.安装JDK 1.建jdk文件夹 cd usr sudo mkdir javajdk 2.移动mv或者复制cp安 ...

  5. PAT-乙级-1034. 有理数四则运算(20)

    1034. 有理数四则运算(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求编写程序,计算2个有理 ...

  6. ADO.net--杂七杂八(一)

    private void BtnConnectDataBase_Click(object sender, RoutedEventArgs e) { string connectionString = ...

  7. Linux下去掉^M的方法

    cat -A filename 就可以看到windows下的断元字符 ^M 要去除他,最简单用下面的命令: dos2unix filename     第二种方法:   sed -i 's/^M//g ...

  8. POJ3122Pie(二分)

    http://poj.org/problem?id=3122 题意 :这个题最主要的就是审题要仔细,翻译不要漏句子.题目讲的是我要过生日,要给好友分馅饼(还有自己也想要一块),怕引起不公,所以每个人大 ...

  9. HDU4756+Prim

    题意简单:去掉最小生成树的某一条边并补上一条,求MaxVal 思路:贪心(借鉴Yamidie的思路...) 分别求出最小生成树和次最小生成树,再在这两棵树上求最小生成树 #include<std ...

  10. c缺陷与陷阱笔记-第六章 预处理器

    1.这一章貌似有个小错误,开始时定义 #define f (x) ((x)-1),然后f(x)代表什么,书上说是(x) ((x)-1),应该是 (x) ((x)-1)(x) 2.关于宏定义中参数的2次 ...