Hdu 3652 B-number (同余数位DP)
2024-09-30 08:00:08
题目链接:
题目描述:
给出一个数n,问 [1, n]区间内有几个数能被13整除并且还有13这个子串?
解题思路:
能整除的数位DP,确定好状态随便搞搞就能过了。dp[x][mod][y][z] 表示 x位的整数,mod 13 等于几, y表示是否出现过13, 最后一位是z。
还有就是发现记忆化搜索 + 数位dp写出来真的很美讷。不说了,直接上代码,干净粗暴。
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int maxn = ;
int dp[maxn][maxn][maxn][maxn], bit[maxn]; int dfs (int pos, int mod, bool s, int num, bool flag)
{
if (pos == -) //每个位置都满了
return mod== && s; //满足题意返回true //对于flag==1的时候,还是要向下搜索的,直接返回可能会加多
if (!flag && dp[pos][mod][s][num] != -)
return dp[pos][mod][s][num]; //如果前面的数都是等于n的,辣么当前这位也不能大于bit[pos]
int len = flag?bit[pos]:;
int ans = ; for (int i=; i<=len; i++)
ans += dfs (pos-, (mod*+i)%, s||(num==&&i==), i, flag&&(i==len)); if (!flag)
dp[pos][mod][s][num] = ans;
return ans;
}
int solve (int n)
{
int pos = ;
while (n)
{
bit[pos ++] = n % ;
n /= ;
}
return dfs (pos-, , , , );
} int main ()
{
int n;
memset (dp, -, sizeof(dp)); while (scanf ("%d", &n) != EOF)
printf ("%d\n", solve (n));
return ;
}
最新文章
- Mac Pro 资源管理器 Double Commander“个性化设置” 备份
- Android 中获得notification的发出时间
- 面向对象编程(十)——继承之Super关键字及内存分析
- HDOJ-三部曲一(搜索、数学)- A Knight&#39;s Journey
- 编写你的第一个 Django 程序 第1部分
- 逆序对的相关问题:bzoj1831,bzoj2431
- ASP.NET MVC 3 Razor Views in SharePoint
- CSS实现倒影-------Day80
- 查看mysql字符集及修改表结构
- sqlserver 自学笔记之 常量,变量及函数
- Oracle解锁的相关操作(转)
- 二分查找(binary search)
- Linux安装JDK步骤
- HighCharts之气泡图
- CXF整合spring
- eclipse代码提示设置过常用字符还是不起作用的解决方法
- 大数据与云计算的关系是什么,Hadoop又如何参与其中?Nosql在什么位置,与BI又有什么关系?
- 基于TcpListerer的web服务器 和 基于HttpListerer的web服务器
- kbmMWUnidac直接SQLServer
- fork()、vfork()、clone()和exec()