[ 题解 ] [ 动态规划 ] 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 }