1. 程式人生 > >動態規劃之糖果分配

動態規劃之糖果分配

candy糖果分配
有N個孩子站成一行,每個孩子有不同的評估值。
分配糖果給這些孩子,受到如下條件的限制:
1. 每個孩子必須至少有一顆糖果
2. 有更高評估值的孩子比他的鄰居有更多的糖果
問:必須分配的最少糖果是多少。

找最大最小值,這種問題叫做尋優問題,也叫做規劃問題。

分析:
1. dp[i]:表示0-i的最少糖果,val[i]:表示i的評估值,c[i]:表示i的糖果
2.

dp[i+1]=dp[i]+1,dp[i]+val[i]+1,val[i+1] <= valval[i+1] >val
3. 2步驟可能出現dp[i]==dp[i+1]==1,需要從右往左進行運算
使得,c[i-1] = c[i-1]+1,if val[i-1] > val[i]

操作過程:
1. 從左向右掃描後能保證比左邊鄰居大1
2. 從右向左掃描後能保證比右邊鄰居大1

    int candy(vector<int> &ratings) {
        int n = ratings.size();
        vector<int> v(n,1);
        for( int i = 1;i < n;i++)
            if(ratings[i]>ratings[i-1]) v[i] = v[i-1]+1;
        int sum = 0;
        for( int i = n-1;i > 0;i--){
            if(ratings[i-1]>ratings[i]&&v[i-1
]<=v[i]) v[i-1] = v[i] + 1; sum += v[i]; } sum += v[0]; return sum; }