【CH5105】Cookies
也是一道线型动态规划的好题…… 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考虑状态转移方程。 1、若给第i个人的饼干数大于1 ,那么我们将这i个人的饼干数都减1(总共减n),他们的怨气值是不会改变的,因而这种情况下,f[i][j]=f[i][j-i]. 2、若给第i个人的饼干数等于1,那么我们枚举一个k(0≤k<i),表示从k之后一直到i所有的人的饼干数都是1,那么f[i][j]=f[k][j-(i-k)]+k*∑g[c[p]] (k<p<=i). 我们先预处理出g数组的前缀和,即可实现O(n)的转移。 综上,我们在两种决策中取最优即可。另外,本题要求输出方案,我们只需在状态转移时记录每个状态的前驱即可。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 int n,m,f[ 40 ][ 5010 ],a[ 40 ][ 5010 ],b[ 40 ][ 5010 ]; 7 int s[ 50 ],ans[ 50 ]; 8 int g[ 50 ],c[ 50 ]; 9 bool cmp( int x, int y) {