【暑假】[深入动态规划]UVa 1628 Pizza Delivery

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 = 100 + 5;
 9
10 int kase, n;
11 int p[maxn], v[maxn];
12 int d[maxn][maxn][maxn][2];
13 int vis[maxn][maxn][maxn][2];
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 == 0) return 0;          //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 = 0;
25   //枚举的i与之前区间相间的部分默认为不会送餐 //比较得出max_ans
26   if(!pos) {                         //pos==s
27     for(int i = 0; i < s; i++)  //s->i  //i在区间的左边
28       ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(i, e, cnt - 1, 0));
29     //ans=max(ans,足够已知的未来价值+子问题价值)
30     for(int i = e + 1; i < n; i++) //s->i //i在区间的右边
31       ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(s, i, cnt - 1, 1));
32   }
33   else {                             //pos==e
34     for(int i = 0; i < s; i++)  //e->i  //i在区间的左边
35       ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(i, e, cnt - 1, 0));
36     for(int i = e + 1; i < n; i++) //e->i  //i在区间的右边
37       ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(s, i, cnt - 1, 1));
38   }
39   return ans;
40 }
41
42 //DP要枚举出所有具有最优可能性的情况 不能遗漏否则问题就可能不是最优
43
44 int main() {
45   int T;
46   scanf("%d",&T);
47   memset(vis, 0, sizeof(vis));
48   for(kase = 1; kase <= T; kase++) {
49     scanf("%d", &n);
50     for(int i = 0; i < n; i++) scanf("%d", &p[i]);   //位置[]
51     for(int i = 0; i < n; i++) scanf("%d", &v[i]);   //原利[]
52
53     int ans = 0;
54     for(int k = 1; k <= n; k++)      //枚举送餐人数
55       for(int i = 0; i < n; i++)     //枚举给送餐的第一个人
56         ans = max(ans, v[i] - k * abs(p[i]) + dp(i, i, k - 1, 0));  //枚举比较 make_max
57     printf("%d\n",ans);
58   }
59   return 0;
60 }
时间: 2024-10-05 05:34:38

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

uva 565 - Pizza Anyone?(暴力枚举 + 二进制)

题目:uva 565 - Pizza Anyone?(暴力枚举 + 二进制) 题目大意:题目是说有一个人要帮他的朋友们定批萨,然后每个朋友都有自己的口味要求,问能不能定一个批萨然后满足每个朋友的至少一个要求. 能就输出所定批萨里面加的东西,,输出要求按字典序: 不能就输出:No pizza can satisfy these requests. 解题思路:这题里面有16种材料,每种材料只有取与不取的可能,这样就有 2^16 种( 0 - 2^16 - 1),枚举出每种情况然后在分别看是否能满足每

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

UVa 12170 Easy Climb 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24844 思路:  引别人一个题解琢磨一下: from:http://blog.csdn.net/glqac/article/details/45257659 代码: 1 #include<iostream> 2 #include<algorithm> 4 #define FOR(a,b,c) for(int a

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

UVa 10618 Fixing the Great Wall 题目:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36139 思路:   数轴上有n个点需要修复,每个点有信息c,x,d 表示位于x且在t时修缮的费用是c+d*t,找一个修缮序列使n个点能全部修缮且有费用最小. 可以发现:在任意时刻,修缮完的点都是连续的,因为修缮不需要时间,将一些点“顺手”修缮了肯定不差. d[i][j][k],表示已经将i-j个点修缮

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

UVa 1627 Team them up! 题目: Team them up! Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Your task is to divide a number of persons into two teams, in such a way, that: everyone belongs to one of th

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

UVa 12099  The Bookcase 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=42067 思路:   将n本书分配到三层,使得形成的书架w*h最小 提前将书籍按照高度排序,因为无论第一本书(最高的书)无论放在那一层都会被考虑到,所以规定将它放在第一层,且第二层比第三层高. 因为从大到小排序的关系,只要jk==0那么新加入的书i就是该层的高度,否则高度不变. 设d[i][j][k]表示考虑过i本书第二

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

UVa 1412 Fund Management 题目: UVA - 1412 Fund Management Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Frank is a portfolio manager of a closed-end fund for Advanced Commercial Markets (ACM ). Fund

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

UVa 10618 Tango Tango Insurrection 题目: Problem A: Tango Tango Insurrection You are attempting to learn to play a simple arcade dancing game. The game has 4 arrows set into a pad: Up, Left, Down, Right. While a song plays, you watch arrows rise on a s

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

 UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 思路:   (/▽\=) 代码: 1 // UVa1380 A Scheduling Problem 2 // Rujia Liu 3 #include<iostream> 4 #include<string> 5 #include<cstring> 6 #include

【暑假】[数学]UVa 1262 Password

UVa 1262  Password 题目: Password Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Shoulder-surfing is the behavior of intentionally and stealthily watching the screen of another person's electronic de