Luogu P4945 最後的戰役

2022-01-10 20:41:34 字數 1220 閱讀 5916

本來以為做法一樣,就是少帶個$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,這樣子比一直...