HDU 4295 狀態壓縮dp KMP

2021-06-10 16:09:13 字數 1224 閱讀 8835

題意:給你乙個字串和他的4個子串,將這4個子串放到原串裡面(可以重疊),問你最多能覆蓋多少個字元,最少能覆蓋多少個字元

解析:網賽的時候dp還是太水了,居然不敢想這個題目,現在看下,其實這個題目還是不難的,只是不好寫,用kmp預處理子串可以插入的位置,dp【i】【j】【k】表示位置i,4個字串的使用狀態為j,k表示 從i往後已經覆蓋了k個了,狀態出來了,轉移應該不難,注意:乙個位置可以放多個串,這是難點,不過經過預處理就好了,一次性在某個位置放很多個串。

**寫的很挫,我以為預處理了這麼多,應該蠻快的,沒想到卡時間過的,看解析夠了。。。**慘不忍睹

#include#include#include#include#includeusing namespace std;

const int maxn = 4100;

const int maxm = 70;

int dp[maxn][20][maxm][2],ok[4][maxn],next[maxm],n,m,l[4],son[4][4];

char s[maxn],p[4][maxm];

vectorh[maxn];

void set_next(int id);

void kmp(int id);

void init();

void solve();

int main()

return 0;

}void init()

for(int i = 0; i < 4; i ++)

}// for(int i = 0; i < 4; i++) for(int j = 0; j < h[i].size(); j ++) printf("i:%d h:%d\n",i,h[i][j]);

}void set_next(int id)

}void kmp(int id)

if(j == len) ok[id][i - j] = true;

}void solve()

for(int j = 0; j < 16; j ++) //used?}}

}}

}int mx = 0,mn = maxn;

for(int k = 0; k < m; k ++) mx = max(mx,dp[n - 1][15][k][1]),mn = min(mn,dp[n - 1][15][k][0]);

printf("%d %d\n",mn,mx);

}

hdu1074狀態壓縮

很明顯的狀態壓縮題目。當然了如果他的意識只有是求最小值沒有要求輸出那個輸出的順序,那麼直接用揹包,甚至是貪心都是可以做出來的,但是要求順序這個揹包的話沒有辦法吧資料記錄下來。所以用二進位制壓縮。所謂的二進位制壓縮就是用二進位制來表示事情的完成程度和狀況,比如1,就是0000001表示第乙個作業做了,...

1074 HDU 狀態壓縮

首先貼兩個狀態壓縮的題解,這是第乙個狀態壓縮dp,想了一下午,不知道是不是有點慢 然後在貼下我自己的 include include include include include include include include define ll int64 define max 1000009 ...

Hdu 1429(狀態壓縮)

有鑰匙和門的 bfs 狀態壓縮 乙個十把鑰匙和鎖,分別為a,b.j 當所用的步數小於 t即可。include include include includeusing namespace std int n,m,t,ans char map 21 21 int dir 4 2 int vis 21 ...