【牛客 - 318J】王者荣耀(dp,01背包)
題干:
"無論何時何地,都會遵守約定"。"奮力逃吧"。"關(guān)于取下敵人性命這件事,也從不失約"。
小懶蟲zmx平時最喜歡玩的游戲就是《王者榮耀》,在這款游戲中它也最喜歡百里守約這個英雄。最近,zmx準備沖國服百里,所以它開始練英雄,你有很多個時間段來練習(xí)英雄,每個時間段有一個開始時間點和結(jié)束時間點,以及可以獲得的熟練度。不過現(xiàn)在你可以隨意修改任意練習(xí)時間段的開始和結(jié)束時間點,但是你不能修改時間段的長度和獲得的熟練度!由于要學(xué)習(xí),你只能在固定時間段玩游戲,問你最多可以獲得多少熟練度?
例如:你可以把[2,3),修改為[1,2)或者[3,4)等等,他們的長度都是1。
注意:對于某個時間段,不管你有沒有修改,必須練完整個時間段長度才能獲得熟練度!
輸入描述:
第一行,三個整數(shù)n,S,T(0<n<=1000,0<S<T<1000)代表n個時間段和你能在[S,T)時間段內(nèi)玩游戲。接下來n行,每行三個整數(shù)a,b(0<a<b<1000),c(0<c<1e7),用空格分開,代表時間段起始時間[a,b)和可以獲得的熟練度。輸出描述:
輸出一行,包括一個整數(shù),表示zmx能獲得的最大熟練度。示例1
輸入
復(fù)制
3 1 3 1 3 5 2 4 6 4 7 8輸出
復(fù)制
6示例2
輸入
復(fù)制
5 1 5 1 2 1 2 3 2 1 3 3 3 4 2 3 6 4輸出
復(fù)制
7解題報告:
可以看出,出這題的思路是,把數(shù)值加法看做區(qū)間的覆蓋,于是背包問題就可以變形成一個區(qū)間問題了。
看出來之后就是一個裸的01背包,背包的大小為T-S。
第 i 個時間段可以看成一個物品,這個物品的體積w[i]=b[i]-a[i],價值v[i] 為熟練度c。
那么dp[i][j]就表示著在前 i 個時間段里花費 j 的時間練英雄能得到的最大熟練度。?
注意longlong,,2333
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 dp[2002]; int w[2002],v[2002]; int main() {int n,s,t;cin>>n>>s>>t;int V = t-s;for(int x,y,c,i = 1; i<=n; i++) {cin>>x>>y>>c;w[i] = y-x;v[i] = c;}for(int i = 1; i<=n; i++) {for(int j = V; j>=w[i]; j--) {dp[j] = max(dp[j],dp[j-w[i]]+v[i]);}}printf("%lld\n",dp[V]);return 0 ;}?
總結(jié)
以上是生活随笔為你收集整理的【牛客 - 318J】王者荣耀(dp,01背包)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winpsd.exe - winpsd是
- 下一篇: 【牛客 - 369B】小A与任务(贪心,