刷题向》关于一道比较优秀的递推型DP(openjudge9275)(EASY+)
先甩出傳送門:http://noi.openjudge.cn/ch0206/9275/
這道題比較經典,
最好不要看題解!!!!!
當然,如果你執意要看我也沒有辦法
首先,顯然的我們可以用 f [ i ] 和 g [ i ] 來表示在第 i 行是公牛或母牛的情況
那么易得遞推式:f [ i ] = f [ i - k - 1 ] + g [ i - k - 1 ] , g [ i ] = g [ i - 1 ] + f [ i - 1 ]
于是通過 f [ n ] + g [ n ] 得到最后答案
但實際上,我們可以將這兩種狀態合并
加上對于k的判斷就可以得到:s [ i ] = s [ i - 1 ] +( i >k + 1 ) ? s [ i - k -1 ] : 1
就是當 i < = k 的時候,我們只需要加上前一個的全部狀態+1,就是這個格子是母牛的狀態加上唯一的這個格子是公牛的狀態。
而當i > k 的時候,也是考慮兩種情況,不過這一格是公牛的方案數不再是1,而是s [ i - k - 1 ],然后加上就可以掃一遍解決啦
甩題目
描述一年一度的展會要來臨了,農民約翰想要把N(1 <= N <= 100,000)只奶牛和公牛安排在單獨的一行中。 約翰發現最近公牛們非常好斗;假如兩只公牛在這一行中靠的太近,他們就會吵架,以至于斗毆,破壞這和諧的環境。約翰非常的足智多謀,他計算出任何兩只公牛之間至少要有K (0 <= K < N)只奶牛,這樣才能避免斗毆。 約翰希望你幫助他計算一下有多少種安排方法,可避免任何斗毆的的發生。約翰認為每頭公牛都是一樣的,每頭奶牛都是一樣的。因而,只要在一些相同的位置上有不同種類的牛,那這就算兩種不同的方法。
第一行:兩個用空格隔開的數:N和K
第一行:一個單獨的數,即約翰可以安排的方法數。考慮到這個數可能很大,你只要輸出mod 5,000,011之后的結果就可以了。
然后直接甩代碼咯
1 #include<stdio.h> 2 int n,k,s[110000]; 3 int main() 4 { 5 scanf("%d%d",&n,&k); 6 s[1]=2; 7 for(int i=2;i<=n;i++) 8 s[i]=(s[i-1]+((i>k+1)?s[i-k-1]:1))%5000011; 9 printf("%d",s[n]); 10 return 0; 11 }
?
轉載于:https://www.cnblogs.com/PencilWang/p/5991342.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的刷题向》关于一道比较优秀的递推型DP(openjudge9275)(EASY+)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 演化计算简单实例(附代码)
- 下一篇: javaweb学习总结二十三(servl