与13有关(数位dp)
2018-03-21 13:00
232 查看
找出1~n范围内含有13并且能被13整除的数字的个数.#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, shu[20], dp[20][20][10];
int dfs(int len, int mod, int state, bool shangxian)
{
if (len == 0)
return mod == 0 && state == 2;
if (!shangxian && dp[len][mod][state])
return dp[len][mod][state];
int cnt = 0, maxx = (shangxian ? shu[len] : 9);
for (int i = 0; i <= maxx; i++)
{
int tz = state;
if (state != 2 && i != 1)//不进行记录
tz = 0;
if (state != 2&& i == 1 )//标记当前位是1
tz = 1;
if (state== 1 && i == 3)//出现13,标记state=2,只要寻找出后面的数字组合;
tz = 2;
cnt += dfs(len - 1, (mod * 10 + i) % 13, tz, shangxian && i == maxx);
}
if (!shangxian)
dp[len][mod][state] = cnt;
return cnt;
}
int main()
{
while (~scanf("%d", &n))
{
memset(shu, 0, sizeof(shu));
memset(dp, 0, sizeof(dp));
int k = 0;
while (n)
{
shu[++k] = n % 10;
n /= 10;
}
printf("%d\n", dfs(k, 0, 0, 1));
}
return 0;
}
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, shu[20], dp[20][20][10];
int dfs(int len, int mod, int state, bool shangxian)
{
if (len == 0)
return mod == 0 && state == 2;
if (!shangxian && dp[len][mod][state])
return dp[len][mod][state];
int cnt = 0, maxx = (shangxian ? shu[len] : 9);
for (int i = 0; i <= maxx; i++)
{
int tz = state;
if (state != 2 && i != 1)//不进行记录
tz = 0;
if (state != 2&& i == 1 )//标记当前位是1
tz = 1;
if (state== 1 && i == 3)//出现13,标记state=2,只要寻找出后面的数字组合;
tz = 2;
cnt += dfs(len - 1, (mod * 10 + i) % 13, tz, shangxian && i == maxx);
}
if (!shangxian)
dp[len][mod][state] = cnt;
return cnt;
}
int main()
{
while (~scanf("%d", &n))
{
memset(shu, 0, sizeof(shu));
memset(dp, 0, sizeof(dp));
int k = 0;
while (n)
{
shu[++k] = n % 10;
n /= 10;
}
printf("%d\n", dfs(k, 0, 0, 1));
}
return 0;
}
相关文章推荐
- 13南京邀请赛c题之数位DP
- 有关动态规划(主要是数位DP)的一点讨论
- hdu 3652 数位dp(能被13整除且包含13的数的个数)
- lightoj 1021 (数位DP)
- HDU 4507 (数位DP)
- 【bzoj 4521】 [Cqoi2016]手机号码(数位dp)
- hdu 4352 状态压缩+数位DP
- cf Beautiful numbers(数位dp)
- 【hdu】4352 XHXJ's LIS【状压+数位dp】
- 数位DP整理总结
- HDU3555->数位DP
- ZOJ 3494 BCD Code (*AC自动机+数位DP 待整理)
- 【CF908G】New Year and Original Order 数位DP
- HDU 2089 不要62(数位dp)
- HDU 5598:GTW likes czf 敲了一天的数位DP
- POJ 3252 Round Numbers(数位dp&记忆化搜索)
- CF55D Beautiful numbers (数位DP)
- 【数位DP】不要62 (入门)
- HDU 2089 不要62 数位dp入门
- DP·数位DP(3)