hihocoder 1076 与链(DP)
2015-04-01 14:52
399 查看
问题可以转化成,对于二进制的每一位,每位最多用k次,那么能加出n的情况数,
这样其实就一个背包问题,利用记忆化搜索,减少需要的状态数
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MOD = 1000000009;
int w[20];
int t, n, k;
int dp[20][10005];
int solve(int u, int sum) {
if (u > 17) return 0;
if (dp[u][sum] != -1) return dp[u][sum];
dp[u][sum] = 0;
if (sum == 0) return dp[u][sum] = 1;
int s = sum;
for (int i = 0; i <= k; i++) {
dp[u][sum] = (dp[u][sum] + solve(u + 1, s)) % MOD;
s -= w[u];
if (s < 0) break;
}
return dp[u][sum];
}
int main() {
w[0] = 1;
for (int i = 1; i < 20; i++) w[i] = w[i - 1] * 2;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &k, &n);
memset(dp, -1, sizeof(dp));
printf("%d\n", solve(0, n));
}
return 0;
}
这样其实就一个背包问题,利用记忆化搜索,减少需要的状态数
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MOD = 1000000009;
int w[20];
int t, n, k;
int dp[20][10005];
int solve(int u, int sum) {
if (u > 17) return 0;
if (dp[u][sum] != -1) return dp[u][sum];
dp[u][sum] = 0;
if (sum == 0) return dp[u][sum] = 1;
int s = sum;
for (int i = 0; i <= k; i++) {
dp[u][sum] = (dp[u][sum] + solve(u + 1, s)) % MOD;
s -= w[u];
if (s < 0) break;
}
return dp[u][sum];
}
int main() {
w[0] = 1;
for (int i = 1; i < 20; i++) w[i] = w[i - 1] * 2;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &k, &n);
memset(dp, -1, sizeof(dp));
printf("%d\n", solve(0, n));
}
return 0;
}
相关文章推荐
- hihoCoder 1076 与链 (数位dp)
- hihocoder-1486物品价值(状压dp)
- HihoCoder1706 : 末尾有最多0的乘积(还不错的DP)
- HihoCoder 1033交错和(数位DP第三题)
- HihoCoder第十二周——树上DP
- hihocoder 1636 : Pangu and Stones(区间dp)
- hihoCoder 1259 A Math Problem 数位dp
- hihoCoder1301 筑地市场(统计符合条件数字,数位dp)
- hihocoder 1124 : 好矩阵 dp
- hihocoder 1157 建造金字塔 (DP)
- bzoj1076【概率dp+状压】
- Hihocoder 1259 :A Math Problem(2015 北京区域赛 K,二进制的数位dp)
- [期望DP] BZOJ1076: [SCOI2008]奖励关
- hihocoder 1515 分数调查(树形dp)
- BZOJ1076:奖励关(状压期望dp)
- hihocoder 1290 DP
- BZOJ 1076 SCOI2008 奖励关 期望状压DP
- hihocoder 1300 展胜地的鲤鱼旗 dp
- hihocoder-1300 展胜地的鲤鱼旗(dp)
- 1076: [SCOI2008]奖励关 概率与期望 DP