kuangbin专题十二 基础DP集合

HDU1260

不把题目复制过来了,只写题意:

电影院卖票,要求尽早卖完,给定两个序列,一个长度为n,表示第i个人只买一张票所需要的时间

第二个序列表示第i个人与前面的第i-1个人一起买两张票所需要的时间,如果两张票同时售卖的时间比两个人单独买票的时间短,则要选择两个人一起买票

这题给的数据是:

2(2组数据)

2(2个人买票)

20 25(两个人单独买票分别需要的时间)

40(两个人一起买票所需要的时间)

1(1个人买票)

8(一个人买票所需要的时间)

对于dp的分析:

扫描二维码关注公众号,回复: 5258436 查看本文章

step1:分析dp代表的数字是谁

step2:确定开二维数组还是一维数组:

step3:确定是从前往后还是从后往前,这题不是逆推的题,所以从1~n

step4:确定过程,过程就根据题意模拟一下就好了

  如果开一维数组,那么dp[x]表示卖给x个人所需要的最小时间

  a[i]表示单独买的时间,b[i]表示两个人一起买需要的时间

  方程为:dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);

  如果开二维数组,那么dp[x][0]表示卖给了x个人,且第x个人单独买票,dp[x][1]表示卖给了x个人,且第x个人和第x-1个人是一起买票的

  方程为:dp[i][0]=min(dp[i-1][0]+dp[i-1][1])+a[i];

      dp[i][1]=dp[i-1][0]+b[i]-a[i-1];

  两种方法都可以,我选择的是第一种

另外,这道题要注意时间的输出格式

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[2019],b[2019],dp[2019],ans,h,m,s;
 4 int main(){
 5     int t,n;
 6     cin >> t;
 7     while(t--){
 8         cin >> n;
 9         h = 8, m = 0, s = 0;
10         for (int i = 1; i <= n;i++)
11             cin >> a[i];
12         for (int i = 2; i <= n;i++)
13             cin >> b[i];
14         dp[1] = a[1];
15         for (int i = 2; i <= n;i++){
16             dp[i] = min(dp[i - 1] + a[i], dp[i - 2] + b[i]);
17         }
18         ans = dp[n];
19         s = ans% 60;
20         m = ans / 60;
21         h = h + (m / 60);
22         m %= 60;
23         if(h>12)
24             printf("%.2d:%.2d:%.2d pm\n", h-12, m, s);
25         else 
26             printf("%.2d:%.2d:%.2d am\n", h, m, s);
27 
28     }
29 
30     system("pause");
31     return 0;
32 }

猜你喜欢

转载自www.cnblogs.com/guaguastandup/p/10413426.html