[ 题解 ] [ 动态规划 ] B. Teamwork

http://codeforces.com/group/NVaJtLaLjS/contest/238203/problem/B


题意:

农夫让牛来包装礼物,N只牛有各自的能力值。

相邻K只牛可以组成一个小组,小组内牛的能力全会提高到与小组内最高的能力值相等。

现在问,这些牛怎么分组,可以得到最大的能力值总和。

(题目没有要求每个小组必须有K只牛)


示例:

Input 

7 3
1
15
7
9
2
5
10 

Output

84


最开始我是没有注意到!相邻!这个条件的,用了最强带最弱的贪心策略,WA到最后才发现条件......


对于一只牛,能组队的只有相邻K-1只;

对第n牛检查相邻的牛中的最大值,然后乘K累加入dp数组。

如果在n+1只牛检查到更大的值,dp数组会被相应地刷新;

反过来,如果第n+1只牛相邻的牛并没有这么强,那么dp数组就不会被更新。


最终,dp数组存的是最好的组队策略得到的能力值总和,输出结果就可以了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int N=0,K=0;
 5 int cows[10002]={0};
 6 int dp[10002]={0};
 7 
 8 int max(int a,int b)
 9 {
10     if(a>b)return a;
11     else return b;
12 }
13 int main()
14 {
15     scanf("%d%d",&N,&K);
16     for(int n=1;n<=N;n++)
17     {
18         scanf("%d",&cows[n]);
19     }
20     
21     for(int n=1;n<=N;n++)
22     {
23         int MAX=cows[n];
24         for(int k=1;k<=K;k++)
25         {
26             dp[n+k]=max( dp[n+k],dp[n]+k*MAX);
27             MAX=max(MAX,cows[n+k]);
28         }
29     }
30     
31     printf("%d\n",dp[N]);
32     return 0;
33 }

猜你喜欢

转载自www.cnblogs.com/Kaidora/p/10540019.html