lightoj 1158 狀態壓縮 數字DP

2021-06-22 10:22:29 字數 700 閱讀 9710

題意:給定乙個數,求有多少種變換是該數對d取余為0

思路:很明顯的數字dp,又因為這題每一位的數的個數是受限制的,所以在轉移的過程中要記錄數的使用情況,而給定的數最多為10位,所以可以用狀態壓縮

dp[statu][premod]表示已經使用statu中的位置的數,且之前的余為premod的個數

ac**如下:

#include #include #include #include using namespace std;

int dp[1<<11][1100];

char s[20];

int length, d;

int dfs( int pos, int statu, int premod )else

}if( dp[statu][premod] != -1 )

bool mark[10];

memset( mark, false, sizeof( mark ) );

int ans = 0;

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

}return dp[statu][premod] = ans;

}int main()

return 0;}/*

3000 1

1234567890 1

123434 2

*/

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 ...

lightoj 1018 (狀態壓縮DP)

設dp s 表示狀態s下所需要的線段的個數,s的二進位制中第x位為1就表示該狀態下第x個點沒被線段覆蓋。需要預處理出來在任意兩點之間連線所覆蓋點的狀態o n 3 然後記憶化搜尋即可。include include include include includeusing namespace std ...

LightOJ1037 Agent 47 狀態壓縮

題目大意 有乙個殺手,他一開始有一把槍,每次開槍只能造成一點傷害,他需要消滅n個敵人,每個敵人有各自的health i 並且有 消滅敵人就可以獲得他的 用來消滅其他敵人 題目解析 n特別小,並且序列不需要有順序,很明顯是狀態dp,dp i 表示消滅序列i時所需要最少的開槍次數,然後dp的時候列舉沒有...