校內測試 祖先(DP)

2021-07-28 11:39:12 字數 1642 閱讀 7585

首先這個題顯然是應該考慮字元合併,一開始看到這個題的時候想到了某個名字就叫做【字元合併】的撞鴨dp題目。。但是那個題和這個題還是有很多不同的地方的,首先這個題可能合併到最後串長仍然很大所以肯定不能撞鴨,並且合併過的字元可能還可以繼續合併,所以好像有點gg。。

然而這個題可以用某種叫做【看資料範圍猜做法】+【loli的noip模擬題肯定不會有什麼類似o(

n85l

og3n

) 這樣的玄學複雜度】的不靠譜方法知道這題複雜度基本上就是o(

n4) 的dp。。並且對於一段區間[i..j]來說,它最後消成什麼東西就只跟把它劈成兩半區間然後這兩半區間分別消成什麼東西有關,然後考試的時候就「嘣」的一下想到可以用f[i][j][k]表示[i..j]這一段能否合併成k這個字元,那麼設原串為s,一開始所有f[i][i][s[i]]都賦值為true,然後dp的時候列舉斷點。這裡要是再用o(

26∗26)

的複雜度列舉兩半區間分別消成什麼字元的話肯定會t,並且判斷也是個問題,那麼可以直接列舉給定的合併規則c1

→c2c

3 ,如果左邊能合併成c2

並且右邊能合併成c3

,那麼中間這個大區間就能合併成c1

。這樣就能用o(

n4) 的時間搞定f陣列。統計答案的時候再用乙個g[i][j]表示[i..j]這一段最少消成幾個字元,仍然列舉斷點來遞推就可以了。

#include

#include

#include

using

namespace

std;

int n,len,g[60][60];

char s[60],from[60],to[60][2];

bool f[60][60][30];

int main()

}memset(f,false,sizeof(f));

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

f[i][i][s[i]-'a'+1]=true;

for (int l=2;l<=len;l++)

for (int i=1;i<=len-l+1;i++)

}memset(g,127,sizeof(g));

g[0][0]=0;

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

for (int j=i;j<=len;j++)

for (int k=1;k<=26;k++)

if (f[i][j][k]==true)//預處理所有能合併成1個字元的區間

for (int l=2;l<=len;l++)

for (int i=1;i<=len-l+1;i++)

printf("%d\n",g[1][len]);

return

0; }

我都不知道我當時考場上怎麼就「嘣」的一下想出來了。。。。。。

8 28校內測試 區間DP

感受到了生活的艱辛qaq.這才是真正的爆錘啊.因為t1t3還沒有理解所以只能貼t2叻qaq 區間dp.爆哭把題理解錯了,以為隨著拿的東西越來越多,斷點也會越來越多,出現可以選很多的情況qaq,然而是不會的,自始至終只會有乙個斷點,哥哥和妹妹取都只有兩個方向,而妹妹還是強制選擇的qaq。所以把環展開就...

校內測試 城堡

矩陣中求左上角的點到右下角的點的距離,不能從下往上走 方案1 動規 初步判定演算法 對於這題,只能從上往下行走,對於到達每乙個點的最優值,一定是從最上方下來的最優值,與左右兩邊最優值的比較,初步確定演算法動態規劃 分析初步演算法 對於從兩邊來的最優值,只有左邊目前是一路dp過來的最優值,而對於右邊則...

矩陣快速冪優化DP 校內測試

實際上是水水題叻,先把樸素dp方程寫出來,發現 dp i 實際上是 dp i k dp i 1 的和,而看資料範圍,我們實際上是要快速地求得這段的和,突然就意識到是矩陣快速冪叻。構建矩陣什麼的還是很簡單滴,主要就是練一練手。還有就是水一水blog!換個字型,換個心情!快速乘是在模數很大時要用,避免超...