hdu3652 B-number(数位dp)
2016-04-22 22:15
513 查看
还是记忆化搜索的方法,dp数组加了一位用于保存mod。只不过这一维只用于保存,没有任何用处。我们想的时候不要用三维空间想,越想过程越麻烦。
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long LL;
const int N = 21;
const int INF = 1e8;
int dp
[14][5], bit
;
int dfs(int pos, int pre, int mod, bool limit, bool flag)
{
if(pos == 0) return flag && (mod == 0);
if(!limit && flag && dp[pos][mod][0] != -1) return dp[pos][mod][0];
if(!limit && !flag && pre != 1 && dp[pos][mod][2] != -1) return dp[pos][mod][2];
if(!limit && !flag && pre == 1 && dp[pos][mod][1] != -1) return dp[pos][mod][1];
int endd = limit ? bit[pos] : 9;
int ans = 0;
for(int i = 0; i <= endd; i ++)
{
ans += dfs(pos - 1, i, (mod * 10 + i) % 13, limit && (i == endd), flag || (pre == 1 && i == 3));
}
if(!limit)
{
if(flag) dp[pos][mod][0] = ans;
if(!flag && pre != 1) dp[pos][mod][2] = ans;
if(!flag && pre == 1) dp[pos][mod][1] = ans;
}
return ans;
}
int solve(int n)
{
int len = 0;
while(n)
{
bit[++ len] = n % 10;
n /= 10;
}
return dfs(len, 0, 0, true, false);
}
int main()
{
// freopen("in.txt", "r", stdin);
int num;
while(~scanf("%d", &num))
{
memset(dp, -1, sizeof(dp));
printf("%d\n", solve(num));
}
return 0;
}
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
typedef long long LL;
const int N = 21;
const int INF = 1e8;
int dp
[14][5], bit
;
int dfs(int pos, int pre, int mod, bool limit, bool flag)
{
if(pos == 0) return flag && (mod == 0);
if(!limit && flag && dp[pos][mod][0] != -1) return dp[pos][mod][0];
if(!limit && !flag && pre != 1 && dp[pos][mod][2] != -1) return dp[pos][mod][2];
if(!limit && !flag && pre == 1 && dp[pos][mod][1] != -1) return dp[pos][mod][1];
int endd = limit ? bit[pos] : 9;
int ans = 0;
for(int i = 0; i <= endd; i ++)
{
ans += dfs(pos - 1, i, (mod * 10 + i) % 13, limit && (i == endd), flag || (pre == 1 && i == 3));
}
if(!limit)
{
if(flag) dp[pos][mod][0] = ans;
if(!flag && pre != 1) dp[pos][mod][2] = ans;
if(!flag && pre == 1) dp[pos][mod][1] = ans;
}
return ans;
}
int solve(int n)
{
int len = 0;
while(n)
{
bit[++ len] = n % 10;
n /= 10;
}
return dfs(len, 0, 0, true, false);
}
int main()
{
// freopen("in.txt", "r", stdin);
int num;
while(~scanf("%d", &num))
{
memset(dp, -1, sizeof(dp));
printf("%d\n", solve(num));
}
return 0;
}
相关文章推荐
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- HDU 1016 Prime Ring Problem
- HDU 1017 A Mathematical Curiosity