[USACO2009 OPEN] 滑雪课 Ski Lessons
生活随笔
收集整理的這篇文章主要介紹了
[USACO2009 OPEN] 滑雪课 Ski Lessons
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
洛谷P2948
?
看到題目就覺得這是動規但一直沒想到如何狀態轉移……看了別人的題解之后才有一些想法
f[i][j]:前i單位時間能力值為j可以滑的最多次數
lessons[i][j]:結束時間為i,獲得能力為j的時長最短的課程的開始時間
ski[i]:能力值為i可以滑的時間最短的坡的時長
d[i]表示前i時長最多可以滑的坡數
?
幾個狀態轉移方程:
喝可可:f[i][j]=max(f[i][j],f[i-1][j])
滑雪:f[i][j]=max(f[i][j],f[i-ski[j]][j]+1)
上課:f[i][j]=max(f[i][j],d[lessons[i-1][j]])
?
隨手貼個代碼:
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 int lessons[10001][101],ski[111],f[10001][101],d[10001]; 6 //lessons[i][j]表示結束時間為i,能力為j的課程的最晚開始時間 7 //ski[i]表示能力值為i可以滑的時間最短的坡的時長 8 //f[i][j]表示前i時長能力值為j最多可以滑的坡數 9 //d[i]表示前i時長最多可以滑的坡數 10 int t,s,n; 11 int main() 12 { 13 scanf("%d%d%d",&t,&s,&n); 14 for(int i=1;i<=s;i++)//初始化lessons[][] 15 { 16 int m,l,a; 17 scanf("%d%d%d",&m,&l,&a); 18 lessons[l+m-1][a]=max(lessons[l+m-1][a],m); 19 } 20 for(int i=1;i<=n;i++)//初始化ski[] 21 { 22 int c,d; 23 scanf("%d%d",&c,&d); 24 for(int j=c;j<=100;j++) 25 if(!ski[j]||ski[j]>d) 26 ski[j]=d; 27 } 28 for(int i=0;i<=t;i++) 29 for(int j=0;j<=100;j++) 30 f[i][j]=-1000000; 31 f[0][1]=0; 32 for(int i=1;i<=t;i++) 33 { 34 for(int j=1;j<=5;j++) 35 { 36 f[i][j]=max(f[i][j],f[i-1][j]);//喝可可 37 if(ski[j]&&i>=ski[j])//滑雪 38 f[i][j]=max(f[i][j],f[i-ski[j]][j]+1); 39 if(lessons[i-1][j])//上課 40 f[i][j]=max(f[i][j],d[lessons[i-1][j]]); 41 d[i]=max(d[i],f[i][j]); 42 } 43 } 44 printf("%d\n",d[t]); 45 return 0; 46 }注意兩個問題:
1、初始化:f[0][1]=0(初始化能力為1),其余都為負無窮!
2、狀態轉移方程沒有f[i][j]=max(f[i][j],f[i][j-1)!
第一次寫的時候因為這兩個問題WA了……但自己也沒想出來為什么……如果有神犇理解的話敬請指教w
?
最后吧分享一句關于動規挺有感觸的一句話……
除了要對基本概念和方法正確理解外,必須具體問題具體分析處理,以豐富的想象力去建立模型,用創造性的技巧去求解
(新人第一次發帖,多多指教)
轉載于:https://www.cnblogs.com/LiHaozhe/p/9475473.html
總結
以上是生活随笔為你收集整理的[USACO2009 OPEN] 滑雪课 Ski Lessons的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jmeter连接到Mysql
- 下一篇: [SHOI2017]组合数问题