題意:給定乙個數,求有多少種變換是該數對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的時候列舉沒有...