#include #include const int maxn = 110;
const int mod = 1e9 + 7;
int c[maxn * maxn][maxn], num[maxn];
long long dp[maxn][maxn * maxn];
int n, kase;
void init()
}int main(int argc, char const *argv)
for (int i = 1; i <= sum; i++)
ans = (ans + dp[n][i]) % mod;
printf("case %d: %lld\n", ++kase, ans);
} return 0;
}
dp[ i ][ j ]表示前i種石頭構成的長度為j的序列的個數。
處理i種石頭時。可以乙個都不要。dp[i][j]=dp[i-1][j]。
也可以要k個。那麼相當於將這k個個石頭放在j個位置上。而將k個石頭放在j個位置上的方法數有c[j][k]種。
而以前的j-k個還是按照原排列。所以有dp[i-1][j-k]*c[j][k]種方法。
so dp[i][j]=sum(dp[i-1][j-k]*c[j][k])。0<=k<=num[i]。
hdu 6143 組合數學 dp
題意 m個字母,組成兩個長度為n的字元,其中乙個字母不能同時出現在兩個串中。問總方案?思路 列舉m個中恰好有i個在第乙個串,有j個在第二個串。然後求個和。具體其中n個空恰好k種顏色,可以用dp預處理。dp j i dp j 1 i i mod dp j 1 i 1 i mod mod include...
合法括號序列(dp 組合數學)
鍵盤上有左括號 右括號 和退格鍵 共三個鍵。牛牛希望按鍵n次,使得輸入的字串恰好乙個合法的括號序列。每按一次左括號 字串末尾追加乙個左括號 每按一次右括號 字串末尾追加乙個右括號 每按一次退格鍵 會刪掉字串的最後乙個字元,特別的,如果字串為空,牛牛也可以按退格,但是什麼都不會發生。輸出方案數對p取模...
hdu 1220 Cube 組合數學
給你乙個邊長n的正方體,切割成n n n個單位體積的小正方體,求所有公共頂點數 2的小正方體的對數。公共點的數目可能有 0,1,2,4.我們用總的對數減掉有四個公共點的對數就可以了。總的對數 n 3 n 3 1 2 一共有n 3塊小方塊,從中選出2塊 而4個交點的立方體對是兩個立方體共面的情況,所以...