DP練習 今天s醬不在家

2022-03-27 07:14:15 字數 2793 閱讀 4374

rt,今天s醬不在家~

於是w就可以為所欲為的刷水題啦~

因為w的dp學的實在是……,於是今天w去刷了幾道dp題練手》_<

1.能量項鍊(luogu p1063)

這題面……考驗語文能力的時刻到了x

一道區間dp

這個環結構看起來就很麻煩的樣子……

那就拆了o(∩_∩)o~

每次讀入乙個a[i]的時候,順手把a[n+i]也賦成這個值

這樣處理完後就是乙個長度為原環兩倍的鏈

在這個鏈上能找到所有長度為n+1的可能排列

//長度n+1是因為最後乙個珠子的尾標是第乙個的頭標,在鏈中即下乙個的頭標

接下來就dp吧

f[i][j]表示區間長度為i,區間左端點的頭標記是j

有了這兩個當然就能算出右端點的尾標記

然後列舉一波斷點(區間dp的套路

因為每個珠子有兩個標記,又只存了乙個數

導致各種+1-1的小細節

qwq看了好久才明白

最後再統計一波答案

#include#include

using

namespace

std;

const

int n=202

;int

n,a[n],ans;

intf[n][n];

intmain()

for(int i=2;i<=n+1;++i)//

區間長度

}for(int i=1;i<=n;++i)//

區間開始位置

ans=max(ans,f[i][i+n]);

cout

return0;

}

energy

2.垃圾陷阱(luogu p1156)

為什麼是卡門不是bessie(

剛一看題面各種mengbier,連dp存什麼都想不出來

跑去看題解,類揹包?++mengbier

看了好久才看懂……做法很神奇x

學了一種刷表的做法

(亂入的科普:刷表指用現在的狀態去更新之後的狀態,與之相反的是填表,指用之前的狀態更新現在的狀態)

dp陣列?不存在的 

這裡的所謂dp陣列其實是乙個bool陣列

裡面存的,既不是高度,也不是能量

f[i][j]表示的是在高度為i,時間為j的情況下能否存活

如果能存活的話就向下轉移

兩個轉移方向:堆起來(i+高度)或者吃掉(j+時間)

轉移完發現高度超出井深了,因為經過了排序,所以得出的一定是最早的時間,輸出就好了

一套迴圈下去這牛還沒有出去,說明它已經在井裡gg了

時間從後向前倒,看它活在這世上的最後一秒是什麼時候

//

傳說中的刷表法qwq

#include#include

#include

using

namespace

std;

int d,g,s=10

;bool f[400][6000];//

f[i][j]->高度為i的情況下能存活j的時間

struct

rubr[

105];

bool

cmp(rub x,rub y)

intmain()

sort(r+1,r+g+1

,cmp);

f[0][10]=1

;

for(int i=1;i<=g;++i)//

垃圾 for(int j=d-1;j>=0;--j)//

高度 for(int k=s;k>=r[i].t;--k)//

時間

else

}for(int i=s;i>=1;--i)

if(f[0

][i])

return

0;

}

rubbish well

3.過河(luogu p1052)

一開始一看,這不是某只⑨的一道題嗎?

然後一看資料範圍,

l<=10^9,1 <= m <= 100

(步長10橋長10^9,心疼這只青蛙一下x)

正常的dp方程很好寫

f[j]=min(f[j],f[i]+stn[j])

然而10^9的資料,時間空間都會炸

但是因為長長的橋上只有很少的石子

所以在兩個石子之間青蛙君會跳過一段很長的沒有石子的距離

就可以把這段距離壓縮一下

把距離》100(10*10)的兩顆石子中間的距離壓到100

……據說還可以壓到90?並不理解qwq,反正有100就夠用了

#include#include

#include

using

namespace

std;

const

int n=50000

;int l,s,t,m,a[200

],stn[n],f[n],tmp;

intmain()

for(int i=1;i<=m;++i)

int ans=200

;

for(int i=1;i<=l+15;++i)f[i]=200

; f[

0]=0

;

for(int i=0;i<=l+15;++i)

for(int i=l;i<=l+15;++i)ans=min(ans,f[i]);

cout

<

return0;

}

過河呀s醬回來了》_<

儲存儲存……

區間DP練習

部落格 lightoj 1422 int dp 105 105 a 105 dp i j i 到 j 最小穿多少衣服 int main printf d n dp 1 n return 0 poj2955括號匹配 int dp 105 105 a 105 dp i j i 到 j 匹配了多少括號。i...

數字DP練習

數字dp模板 hdu2089 不要62 題意 求區間中不含62且不含4的數的個數 include include includeusing namespace std int dp 20 10 int a 20 sta 記錄上一位數是否是6 int dfs int pos,int sta,bool ...

dp專題練習

這是一篇很水的blog 掃雷link include include include include using namespace std inline long long read while c 0 c 9 return f ans long long dp 10001 3 3 3 n,a 9...