Lightoj 1073 數字DP 深搜

2021-06-19 22:26:07 字數 1176 閱讀 5288

這一題,開始自己想的時候,是想要先處理下字串,判斷下兩兩合成乙個字串的時候的最小字串,但是這樣處理了之後就沒有頭緒了,最後參考了別人的思路。

別人的思路如下:

1.首先判斷一下是否有字串是其他字串的字串,若有則取掉。

2.計算將a與b合成乙個字串且b在前的時候,需要在a之前新增字母的最少個數increase[a][b]  比如 a = 「abcdef」 b=「mnbabc」  則increase[a][b] = 3

3.用dp求出 包含狀態statu中的字串且最前面乙個字串為i時的字串的最短長度dp[i][statu],狀態轉移方程很容易就得到了從0向上遞推就可以了

4.用深搜對dp進行搜尋,搜出所要求的字串。

ac**如下:

#include #include #include using namespace std;

#define max 0x3f3f3f3f

int n;

int increase[20][20];

int dp[15][1<<15];//dp[i][statu] 狀態為statu且最前面乙個數str[i]時字串所包含字母的最少個數

string str[15];

bool substring( const string &a, const string & b )

} return false;

}int calc( const string &a, const string &b )

} return ans;

}void printstr( int pos, int stuts )

int ans = -1;

string s = "z";

for( int i = 0; i < n; i++ )if( i != pos && ( stuts & ( 1 << i ) ) )

int temp = 0;

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

}if( j == n )str[temp++] = str[i];

} n = temp;

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

} for( int i = 0; i < n; i++ )

} for( int i = 0; i < n; i++ ){

dp[i][1<

lightoj 1158 狀態壓縮 數字DP

題意 給定乙個數,求有多少種變換是該數對d取余為0 思路 很明顯的數字dp,又因為這題每一位的數的個數是受限制的,所以在轉移的過程中要記錄數的使用情況,而給定的數最多為10位,所以可以用狀態壓縮 dp statu premod 表示已經使用statu中的位置的數,且之前的余為premod的個數 ac...

LightOJ 1140 計數 數字DP 入門

題意 給出a,b求區間a,b內寫下過多少個零 題解 計數問題一般都會牽扯到數字dp,dp我寫的少,這道當作入門了,dfs寫法有固定的模板可套用 dp p count 代表在p位 且前面出現過count個零的方案數 date 2016 10 27 17.26 author lweleth sounge...

lightoj 1011 (狀態壓縮dp)

思路 狀態壓縮dp,設dp i j 表示前i行,狀態為j時的最大值,狀態定義為 若前i行中取了第x列那麼j的二進位制位中第x位為1,否則為0,最後答案就是dp n 1 1 n 1 裝態轉移方程就是 dp i j 1 k max dp i j 1 k dp i 1 j mat i k j 1 k 0 ...