題目大意是,非你若干個任務,任務分別對應開始時間、預期收益、持續時間三項指標,讓你從中選擇乙個受益最大的方案(沒有開始時間相同的任務)。
於是,標準狀態轉移方程應當為,設dp[k]為選擇了前k個任務的最大收益,後面轉移為dp[k+1]=max且能夠共存的(dp[i]);很容易想到n^2的暴力更新,但是這題數量太大,會炸得連渣都不剩。於是需要優化到較低的數量級(比如nlogn)
注意到,我們也許不用對某個任務來選取前k個的最大值,不容易想到優化但是想想劉汝佳同志的話——不方便直接求解的時候想想更新狀態看看,於是就變成了狀態更新公式而不是狀態轉移方程。——對於求得的dp[k]更新所有合法 的,大於k的dp值。注意到,當前序列已經經過了排序,所以,當找到第乙個合法的dp[p]p>k時候,就會有p+1也是合法的狀態,因此很容易想到樹狀陣列相對最大值+二分查詢確定位置(只要有比較函式就可以寫二分)。最後複雜度是nlogn。
另外根據某些奇怪的樹上的書法,,任何乙個動態規劃的優化演算法都應當從如下三個狀態進行考慮:
1、狀態總數 n n
2、決策數 n 1
3、狀態轉移時間複雜度 1 logn
分別對應原始dp和優化後的dp
ac**如下:考慮到沒有校園網所以在vj上面交的。。。於是投籃用了萬能標頭檔案,好孩子不要學我喲~
#includeusingnamespace
std;
const
long
long maxn=300233
;class
mession
;mession messions[maxn];
long
long
tree[maxn];
long
long
dp[maxn];
long
long
n;void insert(int pos,long
long
key)
}long
long getsum(int
pos)
return
ans;
}bool
cmp(mession m1,mession m2)
void
init()
sort(messions+1,messions+n+1
,cmp);
long
long ans=0
;
for(int i=1;i<=n;++i)
cout
}int
main()
gym初級 初始gym環境(二)
import gym env gym.make cartpole v0 print env.action space print env.observation space 輸出結果為 discrete 2 box 4,意思是動作空間中的動作是離散 discrete 的2個動作,狀態空間中的狀態是4...
gym訓練記錄
upd 12.18 老年選手也該看看歐洲的acm了,不然以後就再也沒有機會了 problem a 挺牛逼的結論,與y軸平行的直線最多隻會經過 o log c 個點,拿乙個線段樹維護一下每個x對應哪些圓即可。複雜度 o n log n log c o n problem b 對每種圖討論即可 prob...
gym 倒立擺學習
參考資料 import gym 匯入模組 from policynet import policygradient import matplotlib.pyplot as plt import time display reward threshold 1000 render false 建立乙個環...