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