本來以為做法一樣,就是少帶個$log$,結果發現看不懂出題人的題解(我好菜啊)
那就自己寫一篇吧
比較簡單的$dp$思路
狀態定義:
前兩個轉移很好處理,第三個好像就不好辦了
不妨暴力定義進狀態裡
設$dp[i][j]$表示前$i$秒用了$j$次第三種轉移的最大能量和
轉移:
三種轉移
$(i'
$1,dp[i][j]=max(dp[i][j],dp[i-1][j]+max\left\)$
$2,dp[i][j]=max(dp[i][j],dp[i-1][j]+\sum_p[i'])$
$3,dp[i][j]=max(dp[i][j],dp[i-2][j-1]+2*max(max\left\,\sum_p[i']))$
考慮搞出來這兩個東西
$1,max\left\$
字首最大值即可$o(1)$
$2,\sum_p[i']$
我寫的離散化然後每次用就是$o(1)$
$map$也可以,但是用$map$的話,切記,對於相同的$i$,上式的值是相同的,不要放到列舉$j$的內層迴圈了
#include#include#include
using
namespace
std;
const
int maxn=50010
;int dp[maxn][510],n,m,k[maxn],p[maxn],x[maxn],mp[2*maxn],maxa,cnt,sum[2*maxn];
intmain()
for(int i=1;i<=n;i++)
scanf("%d
",&x[i]),mp[++cnt]=x[i];
sort(mp+1,mp+cnt+1
); cnt=unique(mp+1,mp+cnt+1)-mp-1
;
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
}int ans=0
;
for(int i=0;i<=m;i++)
ans=max(ans,dp[n][i]);
printf(
"%d\n
",ans);
return0;
}
Luogu P1208 混合牛奶
這個題目直接開個結構體按 排序,然後一直加加加,就可以了。典型的貪心。include include include include include include using namespace std int i,m,n,j,k,ans struct mana 5001 bool cmp man...
luogu P1525 關押罪犯
題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...
luogu P2619 奶牛工資
原題位置 這道題是個貪心,怎麼說是貪心呢,就是先選大的,後考慮小的 千萬不要把上句話的意思理解歪了,一開始我就理解歪了,然後華麗麗地tle了 其實就是for,然後如果當前這個值可以被選,就選到不能再選這個值為止 還有乙個小技巧,就是我們定義乙個值,等於c,然後用這個值減,知道小於等於0,這樣子比一直...