HDU 6249 Alice’s Stamps(dp)
生活随笔
收集整理的這篇文章主要介紹了
HDU 6249 Alice’s Stamps(dp)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
http://acm.hdu.edu.cn/showproblem.php?pid=6249
題意:
給出n個(gè)區(qū)間,求選k個(gè)區(qū)間的最大區(qū)間并。
?
思路:
可能存在左端點(diǎn)相同的多個(gè)區(qū)間,那么此時(shí)我們肯定選右端點(diǎn)最大的那個(gè)區(qū)間。現(xiàn)在將區(qū)間按左端點(diǎn)排序,d[i][j]表示在1~i坐標(biāo)軸范圍內(nèi)選擇j個(gè)區(qū)間的最大區(qū)間并。
狀態(tài)轉(zhuǎn)移方程如下:
dp[i+1][j] = max(dp[i][j],dp[i+1][j]); //不選的話就和上一個(gè)一樣 dp[i+num][j+1] = max(dp[i][j]+num,dp[i+num][j+1]); //選擇 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 const int maxn = 2000+5; 8 9 int n,m,k; 10 int dp[maxn][maxn]; 11 12 struct node 13 { 14 int l,r; 15 bool operator< (const node& rhs) const 16 { 17 return l<rhs.l; 18 } 19 }s[maxn]; 20 21 int main() 22 { 23 //freopen("in.txt","r",stdin); 24 int T; 25 int kase = 0; 26 scanf("%d",&T); 27 while(T--) 28 { 29 scanf("%d%d%d",&n,&m,&k); 30 for(int i=1;i<=m;i++) 31 scanf("%d%d",&s[i].l,&s[i].r); 32 memset(dp,0,sizeof(dp)); 33 sort(s+1,s+m+1); 34 int pos = 1, num = 0; 35 for(int i=0;i<n;i++) 36 { 37 while(pos<=m && s[pos].l==i+1) 38 { 39 num = max(num, s[pos].r - s[pos].l + 1); 40 pos++; 41 } 42 43 for(int j=0;j<=k;j++) 44 { 45 dp[i+1][j] = max(dp[i][j],dp[i+1][j]); 46 dp[i+num][j+1] = max(dp[i][j]+num,dp[i+num][j+1]); 47 } 48 if(num) num--; //因?yàn)樽蠖它c(diǎn)右移了一位,所以這里需要 49 } 50 printf("Case #%d: ",++kase); 51 printf("%d\n",dp[n][k]); 52 } 53 return 0; 54 }?
轉(zhuǎn)載于:https://www.cnblogs.com/zyb993963526/p/8120240.html
總結(jié)
以上是生活随笔為你收集整理的HDU 6249 Alice’s Stamps(dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Print out Android ke
- 下一篇: 【bzoj4372】烁烁的游戏 动态点