1. 程式人生 > 其它 >5月 DP 做題記錄

5月 DP 做題記錄

前言

見一位同學,發出每天切一道dp挑戰,見後有感,我也來???

但我不會每天都寫一篇哈哈。

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

目錄

//--------------------------------------------------------------------------------------------------------------------------

P8329 [ZJOI2022] 樹

二維計數動態規劃,本來想等週日寫一篇題解的,但發現週六就已經過了六篇了,估計輪不到我了。

AC Record

核心轉移方程:

f[j+1][k+1]=dp(f[j+1][k+1],a);
f[j+1][k]=f[j+1][k]+...;
f[j][k+1]=dp(f[j][k+1],a);

//--------------------------------------------------------------------------------------------------------------------------

P6734 「Wdsr-2」陰陽玉

這道題非常好!一道將數學和 dp 完美融合在一起的題。但是,直接 dp 沒有辦法最優,會T掉,這個時候需要用到 dp 優化,矩陣加速優化。最後進行分類討論。

AC Record

核心轉移方程:

f[m][i][j]=dp(f[m][i][j],f[m-1][k][j]*f[m-1][i][n]);

//--------------------------------------------------------------------------------------------------------------------------

P8321『JROI-4』瀋陽大街 2

看題面覺得是一個概率 dp,就覺得考的是數學期望;但實際就是一個普普通通的 dp(這個傻子第一個思路就硬往期望上想,後來寫全排列的時候發現這就是個普通 dp...)

話說為什麼我程式碼執行記憶體高達 $379 $MB,我看樓下幾個就 \(700\) 多KB???

AC Record

核心轉移方程:

f[i][j]=(f[i][j]+f[i-1][j-1]*b1*v);
f[i][j]=(f[i][j]+f[i-1][j-1]*b2*v);

//--------------------------------------------------------------------------------------------------------------------------

P3195 [HNOI2008] 玩具裝箱

一道斜率優化 dp,只不過一個斜率優化好像不太夠,需要加一個二分,但是硬生生沒看出來和單調佇列有什麼關係啊。。。。

AC Record

核心轉移方程:

s[i]+=s[i-1],a[i]=s[i]+i,b[i]=a[i]+len+1;

之後斜率優化就是算一下斜率判定一下就好。

//--------------------------------------------------------------------------------------------------------------------------

P1450 [HAOI2008] 硬幣購物

先求出無限制的方案數,再減去單個硬幣超限的情況,然後加上兩個硬幣超限的情況,再減去硬幣超限的情況,最後再加上四個硬幣超限的情況,即為最終答案。容斥原理!!!

AC Record

核心轉移方程

f[j]=f[j]+f[j-a[i]];

//--------------------------------------------------------------------------------------------------------------------------

P1654 OSU

每次代價都增加 \(1\),也就是平方和立方的增量是 \(1\),利用開始的兩個公式和維護的值就可以遞推。

AC Record

核心轉移方程

b[i]=(b[i-1]+1)*a[i]
.........
(三個基本一樣的式子)

//--------------------------------------------------------------------------------------------------------------------------

CF453A Little Pony and Expected Maximum

數學概率與期望。(但好像可以直接猜結論)

AC Recod

核心轉移方程

i+=dp(j/m,n)-dp(j-1)/m,n)*j;

//--------------------------------------------------------------------------------------------------------------------------

P7395 彈珠遊戲

打個表出來,表示所有能走的情況,然後 DP ,比較噁心的是這個還得加上博弈論和記憶化......

AC Record

核心轉移方程

dp[5][i*4+j]=bi*4+bj;
dp[5][i*4+j]=ai*4+aj;

//--------------------------------------------------------------------------------------------------------------------------

P1896 [SCOI2005] 互不侵犯

狀壓的核心就是把一行、一列數用二進位制數來表示。那麼對於這道題,每一行的狀態(即1為放0為不放)由上一行和自身是否符合條件決定。那麼狀態是可以先預處理出來的。

另外在預處理還有一個小技巧,就是判斷國王是否相鄰,即i&(i<<1),為0就是合法的,這在狀態轉移時判斷上下兩行的放置是否合法也是能用的。

AC Record

核心轉移方程

f[i][j][q]+=f[i-1][k][q-a[j]];

//--------------------------------------------------------------------------------------------------------------------------

P1539 [TJOI2011] 01矩陣

想到矩陣在不同情況下最短邊 \(MAX\)\(15\),正好可以狀壓\(dp\)

AC Record

核心轉移方程

f[i][j]=(f[i][j]+f[i-1][k])%p;

//--------------------------------------------------------------------------------------------------------------------------

P1552 [APIO2012] 派遣

核心想法:錢越少人越多最棒。

AC Record

核心轉移方程

f[i]=dp(f[i],a[j]*b[j]);

//--------------------------------------------------------------------------------------------------------------------------

P2110 歡總喊樓記

在 dfs 引數中帶入最高位的數字,所有數位列舉,判斷最低是否等於最高。

這題還要考慮前導零,不過不需要像其他的數位 dp 那樣在 dfs 引數中帶 bool 變數記錄或者 dp 數組裡多開一維,因為我們有最高位的數字,當最高位不是 0 時就說明沒有前導零。

當出現第一個非 0 位,就得到了最高位的數。

AC Record

核心轉移方程

k=k*10+a[i];

//--------------------------------------------------------------------------------------------------------------------------

P1281 書的複製

一道二分題

然後我懶得想了

直接dp+dfs+字首和

AC Record

核心轉移方程

dp[i][j]=min(dp[i][j],max(dp[i-1][k],a[j]-a[k]));

//--------------------------------------------------------------------------------------------------------------------------

AT5801 [AGC043D] Merge Triplets

考慮對於要計數的排列 \(p\)(長度為 \(3n\))進行劃分,化成長度為 \(3\)\(n\) 組。我們考慮過 \(p_1\) 的那個組需要滿足什麼條件。

考慮 \(i\) 的下方是 \(j\) 需要滿足什麼條件。

直接 dp 維護差值。

AC Record

核心轉移方程

dp(f[i+1][j+1],f[i][j]);
dp(f[i+2][j-1],cnt1);	
dp(f[i+3][j],cnt2);
dp(ans,f[n][i]);

//--------------------------------------------------------------------------------------------------------------------------

P3698 [CQOI2017]小Q的棋盤

往下走回來,走 \(a\) 步,結點夠,一定能夠訪問到 \(\frac {k} {2}\)個結點。對於一個結點,我們列舉一個它的子結點和一個在子結點中走的步數,得到可以不返回時的訪問數再加上走剩下的子樹且一定返回的訪問數。

AC Record

核心轉移方程

dp(n,a+(m-a+1)/2)

//--------------------------------------------------------------------------------------------------------------------------

P3239 [HNOI2015]亞瑟王

用每張牌的發動概率 \(g[i]\) 乘那張牌的傷害 \(d[i]\),最後根據期望的線性性質相加即可。

AC Record

核心轉移方程

f[i][j]=f[i-1][j]*dp[k-j];
a=f[i-1][j-1]*(1-dp[k-j+1]);
f[i][j]+=a;

//--------------------------------------------------------------------------------------------------------------------------

P2365 任務安排

斜率優化動態規劃

AC Record

核心轉移方程

dp[i]=min(dp[i],dp[j]+f*(b[n]-b[i-1]));

//--------------------------------------------------------------------------------------------------------------------------

P3572 [POI2014]PTA-Little Bird

單調佇列+DP。

保證單調佇列裡的元素相同體力消耗下靠近隊首的高度儘量高即可,

相當於在維護佇列體力消耗值從隊首到隊尾遞增的基礎上對高度進行遞減的維護。

AC Record

核心轉移方程

f[i]=f[d[l]]+(a[d[l]]<=a[i]);

//--------------------------------------------------------------------------------------------------------------------------

P4832 珈百璃墮落的開始

問題轉為揹包問題:每個式子抽象成物品,\(s−c\)抽象成重量,而我們的目標是找到總重量為0時的最大價值,價值抽象成s(或者c),因為每一對配對的s和c價值為1。

AC Record

核心轉移方程

ans=max(ans,r[i]+l[i]+i);

//--------------------------------------------------------------------------------------------------------------------------

P1439 【模板】最長公共子序列

板子題,方法較多,dp + 二分 挺舒服的

AC Record

核心轉移方程

dp[lower_bound(f,dp[x])-f]=dp[x];

//--------------------------------------------------------------------------------------------------------------------------

P8356 「WHOI-1」數列計數

優化遞迴(爆搜)的 ---->> 遞迴轉遞推

AC Record

核心轉移方程

f[k][j]=(f[!k][j-1]+f[!k][j])%M;
f[k][j]=f[!k][j];

//--------------------------------------------------------------------------------------------------------------------------

P3296 [SDOI2013]刺客信條

md 散兵陽間題目

我該開始拿資料結構肝了半天,寫了近三百行的程式碼,把手都給我寫廢了,之後還卡了兩波 MLE。後來AC之後才知道可以dp挖艹。

AC Record

核心轉移方程

ans = min(ans,f[i]+dp[j]-w[i][j])

//--------------------------------------------------------------------------------------------------------------------------

P4072 [SDOI2016]征途

考慮斜率優化

假設 \(j\)\(k\) 更優,則有 \(dp[j]+(sum[i]-sum[j])^2<dp[k]+(sum[i]-sum[k])^2\)

然後展開移項即可

AC Record

核心轉移方程

m*f[m][n]-dp[n]*dp[n]

//--------------------------------------------------------------------------------------------------------------------------

P8352 [SDOI/SXOI2022] 小 N 的獨立集

狀態合併存到樹裡,然後 dp 套 dp ,最後 dfs;

AC Record

核心轉移方程

dp[j][a]=f[l][j][a];
f[l][j][a]=0;

//--------------------------------------------------------------------------------------------------------------------------