Juice Extractor dp
生活随笔
收集整理的這篇文章主要介紹了
Juice Extractor dp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
水果忍者游戲,給出N個水果的出現時間和消失時間。
每次切可以清除該時刻中屏幕上的所有水果,只有combo>=3的時候才得分,得分為combo的值。
題解:
可以把每個水果看成是一段時間區間。
然后把這些區間按照出現時間為第一關鍵字,消失時間為第二關鍵字排序。
我們定義dp方程dp[i]表示最后一刀切掉第i個水果,所獲得的最大積分。
那么,最優的方案肯定是在第i個水果出現時間進行切。
這樣的話,轉移方程
dp[i] = max(dp[i],dp[j-1]+sum);
其中sum表示j到i之間所有結束時間>=第i個水果出現時間的水果數量。
但是注意!
這個題目有一個限制,就是說每次切必定將所有的水果都切完。
也就時候如果j-1水果的出現時間=第j個水果的出現時間的話,那么是不能進行轉移的,因為切第j-1個水果的時候必然把第j個水果切掉,不會留下。
代碼:
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> P; bool cmp(P p1,P p2){if(p1.first == p2.first) return p1.second < p2.second;return p1.first < p2.first; } const int maxn = 1005; P ps[maxn]; int dp[maxn]; int n; int main(){int T,cas=0;cin>>T;ps[0].first = ps[0].second = -1;while(T--){memset(dp,0,sizeof(dp));scanf("%d",&n);for(int i = 1;i <= n;++i){int a,b;scanf("%d %d",&a,&b);ps[i] = make_pair(a,b);} sort(ps+1,ps+1+n,cmp);int ans = 0;if(n >= 3){for(int i = 3;i <= n;++i){int tim = ps[i].first;int sm = 0;for(int j = i;j >= 1;--j){if(ps[j].second >= tim) sm++;if(ps[j-1].first != ps[j].first)dp[i] = max(dp[i],dp[j-1] + (sm >= 3?sm:0));}ans = max(ans,dp[i]);}}printf("Case #%d: %d\n",++cas,ans);}return 0; }總結
以上是生活随笔為你收集整理的Juice Extractor dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Detection of Extrate
- 下一篇: codeforces Balanced