递推DP URAL 1031 Railway Tickets

题目传送门

 1 /*
 2     简单递推DP:读题烦!在区间内的都更新一遍,dp[]初始化INF
 3     注意:s1与s2大小不一定,坑!
 4     详细解释:http://blog.csdn.net/kk303/article/details/6847948
 5 */
 6 #include <cstdio>
 7 #include <iostream>
 8 #include <algorithm>
 9 #include <cstring>
10 #include <string>
11 #include <queue>
12 using namespace std;
13
14 const int MAXN = 1e4 + 10;
15 const int INF = 0x3f3f3f3f;
16 int C[4], L[4];
17 int dp[MAXN], a[MAXN];
18
19 int main(void)        //URAL 1031 Railway Tickets
20 {
21     //freopen ("Y.in", "r", stdin);
22
23     while (scanf ("%d%d%d%d%d%d", &L[1], &L[2], &L[3], &C[1], &C[2], &C[3]) == 6)
24     {
25         int n;    scanf ("%d", &n);
26         int s1, s2;
27         scanf ("%d%d", &s1, &s2);
28         if (s1 > s2)    swap (s1, s2);
29         a[1] = 0;
30         for (int i=2; i<=n; ++i)
31         {
32             scanf ("%d", &a[i]);    dp[i] = INF;
33         }
34
35         dp[s1] = 0;
36         for (int i=s1+1; i<=s2; ++i)
37         {
38             for (int j=1; j<=3; ++j)
39             {
40                 int k = i - 1;
41                 while (k >= s1)
42                 {
43                     if (a[i] - a[k] > L[j])    break;
44                     if (dp[i] > dp[k] + C[j])    dp[i] = dp[k] + C[j];
45                     k--;
46                 }
47             }
48         }
49
50         printf ("%d\n", dp[s2]);
51     }
52
53     return 0;
54 }
时间: 2024-09-30 05:40:03

递推DP URAL 1031 Railway Tickets的相关文章

递推DP URAL 1353 Milliard Vasya&#39;s Function

题目传送门 1 /* 2 题意:1~1e9的数字里,各个位数数字相加和为s的个数 3 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 4 状态转移方程:dp[i][j] += dp[i-1][j-k],为了不出现负数 5 改为:dp[i][j+k] += dp[i-1][j] 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #include <cmath> 10 #include <algorithm

递推DP URAL 1119 Metro

题目传送门 1 /* 2 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 3 递推DP:仿照JayYe,处理的很巧妙,学习:) 4 好像还要滚动数组,不会,以后再补 5 */ 6 #include <cstdio> 7 #include <iostream> 8 #include <algorithm> 9 #include <cmath> 10 #include <cs

递推DP URAL 1260 Nudnik Photographer

题目传送门 1 /* 2 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cmath> 7 #include <cstring> 8 using namespace std; 9 10 const int MAXN = 1e4 + 10; 11 const int INF = 0x3f3f3f3f; 12 int

递推DP URAL 1017 Staircases

题目传送门 1 /* 2 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 3 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 4 状态转移方程:dp[i][j] += dp[i-j][k] 表示最后一列是j,那么上一个状态是少了最后一列 5 总共i-j块砖头,倒数第二列是k块砖头.k<j, j<=i 6 最后累加dp[n][i], i<n因为最少要两层 7 dp[0][0] = 1; 8 还有更简单的做法,没

递推DP URAL 1081 Binary Lexicographic Sequence

题目传送门 1 /* 2 dp[i][1]/dp[i][0] 表示从左往右前i个,当前第i个放1或0的方案数 3 k -= dp[n][0] 表示当前放0的方案数不够了,所以必须放1,那么dp[n][0]个方案数都不能用了 4 相当于k减去这么多 5 详细解释:http://www.cnblogs.com/scau20110726/archive/2013/02/05/2892587.html 6 */ 7 #include <cstdio> 8 #include <algorithm&

递推DP URAL 1167 Bicolored Horses

题目传送门 1 /* 2 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy指数是多少 3 状态转移方程:dp[i][l] = min (dp[i][l], dp[i-1][j] + cur * (l - j - cur)) 表示第l匹马要不还在i马棚,或者去新的马棚 4 本题关键在dp初始化INF,由于黑马白马的表示简单,求指数方便 5 */ 6 #include <cstdio> 7 #include <iostream>

递推DP URAL 1586 Threeprime Numbers

题目传送门 1 /* 2 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 3 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 4 所以,dp[i][j][k] 表示i位数字,最高位数字j,第二高位数字k 5 状态转移方程:dp[i][j][k] += dp[i-1][k][l] 6 注意:最高位从1开始枚举:) 7 详细解释:http://blog.csdn.net/zhangyanxing666/article/detai

URAL 1031 Railway Tickets

动态规划. 一道完全自己想然后看了眼别人给的样例测试了一下程序的题...... 题的意思就是有许多站台,给出的距离是距离第一个的,然后一个长度一个价钱,问从一个站台到另一个站台需要的最小费用 动态规划嘛... 写的是n^2的,,应该有n的....注意给的起点终点的大小关系!!! #include<stdio.h>记得开LONG LONG #include<string.h> #include <algorithm> #include <bits/stdc++.h&

hdu 1284 钱币兑换问题 (递推 || DP || 母函数)

钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5069    Accepted Submission(s): 2868 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Outpu