DP-hdu1260
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260
题目描述:
题目大意:每一个人去电影票买票,有两种买票方法:1、自己单人买;2、与前面的人一起买;Joe是售票员,他想要早点下班,因此需要你编程序计算他能下班的最早时间。
解题思路:首先用一个数组a来存放每个人自己一个人买票所需时间,再用一个数组dou来存从第二个人开始,每个人与前面一个人合并买票所需时间,因为第一个人的前面不可能有人了(除了售票员Joe,哈哈),所以第一个人的买票时间是确定了的为a[1]。采用动态规划来解决此问题,动态转移方程式为
dp[i]=min(dp[i-1]+a[i],dp[i-2]+dou[i]);
即:第i个人买票所花的最少时间等于min( 前面i-1个人 买票所花时间 加上 第i个人(自己) 买票所花时间, 前面的i-2个人 买票所花时间 加上 第i个人与第i-1个人(自己与前面那人)合并买票所花时间);
代码实现:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int dp[2000]; int main() { int n,a[2000],k,dou[2000];//a数组存放单人买票所花时间,dou数组存放与前面那人一起买票所花时间 scanf("%d",&n); while(n--) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); memset(dou,0,sizeof(dou)); scanf("%d",&k); for(int i=1;i<=k;i++) scanf("%d",&a[i]); for(int i=2;i<=k;i++) scanf("%d",&dou[i]); dp[1]=a[1];//第一个人买票时间是固定了的,因为他的前方不再可能有人与他一起买票了 for(int i=2;i<=k;i++)//从第二个人开始遍历,找出最终的买票时间 dp[i]=min(dp[i-1]+a[i],dp[i-2]+dou[i]); int h=dp[k]/3600;///记录最终的时间 int m=dp[k]%3600/60; int s=dp[k]%60; printf("%02d:%02d:%02d%s\n",(8+h)%24,m,s,(h+8)%24>12?" pm":" am");//输出时间hh:mm:ss的简单操作 } return 0; }