【牛客 - 315F】美丽的项链(线性dp,递推,我为人人)
生活随笔
收集整理的這篇文章主要介紹了
【牛客 - 315F】美丽的项链(线性dp,递推,我为人人)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題干:
?
妞妞參加了Nowcoder Girl女生編程挑戰(zhàn)賽, 但是很遺憾, 她沒能得到她最喜歡的黑天鵝水晶項鏈。
于是妞妞決定自己來制作一條美麗的項鏈。一條美麗的項鏈需要滿足以下條件:
1、需要使用n種特定的水晶寶珠
2、第i種水晶寶珠的數(shù)量不能少于li顆, 也不能多于ri顆
3、一條美麗的項鏈由m顆寶珠組成
妞妞意識到滿足條件的項鏈種數(shù)可能會很多, 所以希望你來幫助她計算一共有多少種制作美麗的項鏈的方案。
輸入描述:
?輸入包括n+1行, 第一行包括兩個正整數(shù)(1 <= n <= 20, 1 <= m <= 100), 表示水晶寶珠的種數(shù)和一條美麗的項鏈需要的水晶寶珠的數(shù)量。
接下來的n行, 每行兩個整數(shù)li,?ri(0 <= li <= ri <= 10), 表示第i種寶珠的數(shù)量限制區(qū)間。
輸出描述:
輸出一個整數(shù), 表示滿足限定條件的方案數(shù)。保證答案在64位整數(shù)范圍內(nèi)。示例1
輸入
復(fù)制
3 5 0 3 0 3 0 3輸出
復(fù)制
12備注:
對于兩種方案,當有任意一種水晶寶珠個數(shù)不同,就視為兩種不同方案。解題報告:
? dp[i][j],代表按順序用到第 i 種,且用了j顆寶珠? 的方法數(shù)。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; ll l[505],r[505]; ll dp[550][550]; int main() {int n,m;cin>>n>>m;for(int i = 1; i<=n; i++) {scanf("%lld%lld",l+i,r+i);} dp[0][0]=1;//通常都這樣 for(int i = 1; i<=n; i++) {for(int j = 0; j<=m; j++) {for(int cur,k = l[i]; k<=r[i]; k++) {cur = j+k;dp[i][cur] += dp[i-1][cur-k];}}}printf("%lld\n",dp[n][m]);return 0 ;}其實可以直接寫dp[i][j+k] += dp[i-1][j],,一種我為人人的想法就完事了。
本來想dp[][][],,后來發(fā)現(xiàn)不行,,想想為什么、、
總結(jié)
以上是生活随笔為你收集整理的【牛客 - 315F】美丽的项链(线性dp,递推,我为人人)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剧本杀、密室逃脱新规:不得在非假期向未成
- 下一篇: 【HDU - 6187】Destroy