小明的密码-初级DP解法
#include
#include
#include
using namespace std;
int visited[5][20][9009];// 访问情况
int dp[5][20][9009]; // M N num num即M-1位的数字
int num_2[7]= {2,3,5,7,11,13,17};
int num_3[9]= {2,3,5,7,11,13,17,19,23};
int num_4[11]= {2,3,5,7,11,13,17,19,23,29,31}; //存储素数
int N,M;
int delete_head(int num,int m) //去掉当前数字的首个数字
{
int ans;
if (m==2) return 0;
if (m==3) ans=num-num/10*10;
if (m==4) ans=num-num/100*100;
return ans;
}
int divide_num(int num)
{
int ans=0;
while (num>0)
{
ans+=num;
num=num/10;
}
return ans;
}
int select_num(int k,int sum,int m)
{
if (m==2)
{
for (int i=0; i<7; i++) if (k+divide_num(sum)==num_2[i]) return 1;
return 0;
}
if (m==3)
{
for (int i=0; i<9; i++)
if (k+divide_num(sum)==num_3[i])
{
return 1;
}
return 0;
}
if (m==4)
{
for (int i=0; i<11; i++) if (k+divide_num(sum)==num_4[i]) return 1;
return 0;
}
}
void work(int m,int n,int num)
{
if (n==0) // n=0直接处理
{
visited[m][n][num]=1;
dp[m][n][num]=1;
}
else
{
if (!visited[m][n][num])
{
visited[m][n][num]=1;
for (int k=0; k<=9; k++)
{
if (select_num(k,num,m))
{
int next=delete_head(num,m)*10+k; //next是num的下个状态(去头加尾)
if (!visited[m][n-1][next])
{
work(m,n-1,next);
}
dp[m][n][num]+=dp[m][n-1][next];
}
}
}
}
}
int main()
{
memset(visited,0,sizeof(visited));
memset(dp,0,sizeof(dp));
scanf("%d %d",&N,&M);
if (M==1)
{
int ans=1;
while (N>0)
{
ans*=4;
N--;
}
printf("%d\n",ans);
}
if (M==2)
{
int ans=0;
for (int i=0; i<=9; i++)
{
int num=i;
work(M,N-1,num);
ans+=dp[M][N-1][num];
}
printf("%d\n",ans);
}
if (M==3)
{
int ans=0;
for (int i=0; i<=9; i++)
for (int k=0; k<=9; k++)
{
int num=i*10+k;
work(M,N-2,num);
ans+=dp[M][N-2][num];
}
printf("%d\n",ans);
}
if (M==4)
{
int ans=0;
for (int i=0; i<=9; i++)
for (int k=0; k<=9; k++)
for (int x=0; x<=9; x++)
{
int num=i*100+k*10+x;
work(M,N-3,num);
ans+=dp[M][N-3][num];
}
printf("%d\n",ans);
}
return 0;
}
小明的密码由N(1<=N<=12)个数字构成,每个数字都可以是0至9中任意一个数字,但小明的密码还有 一个特点就是密码中连续的M(1<=M<=4)个数字的和是质数,现给定M和N,求满足条件的密码共有多少 个? 输入格式 第1行是T,case数量,此后T行,每行两个数,N和M 输出格式 每个case输出一个满足条件的密码总数
输入样例
2
1 1
2 1
输出样例
4
16
作者 admin
第一次做多维DP,虽然才做到第三个维度,感觉已经够狠的题目还可以出的更复杂,比如M更大的时候我还没想过怎么操作,暂时做到三维DP,主要是做第三维的时候遇到困难,第一次做的时候把前M-1位的数字和求出来做参数,没想到维度混淆了,还是只能用M-1做真整数,这样如果M稍微大一点,我可能都要做高精度了,而且内存也不宽裕,继续努力想其他解法吧
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int visited[][][];// 访问情况
int dp[][][]; // M N num num即M-1位的数字
int num_2[]= {,,,,,,};
int num_3[]= {,,,,,,,,};
int num_4[]= {,,,,,,,,,,}; //存储素数
int N,M;
int delete_head(int num,int m) //去掉当前数字的首个数字
{
int ans;
if (m==) return ;
if (m==) ans=num-num/*;
if (m==) ans=num-num/*;
return ans;
}
int divide_num(int num)
{
int ans=;
while (num>)
{
ans+=num;
num=num/;
}
return ans;
}
int select_num(int k,int sum,int m)
{
if (m==)
{
for (int i=; i<; i++) if (k+divide_num(sum)==num_2[i]) return ;
return ;
}
if (m==)
{
for (int i=; i<; i++)
if (k+divide_num(sum)==num_3[i])
{
return ;
}
return ;
}
if (m==)
{
for (int i=; i<; i++) if (k+divide_num(sum)==num_4[i]) return ;
return ;
}
}
void work(int m,int n,int num)
{
if (n==) // n=0直接处理
{
visited[m][n][num]=;
dp[m][n][num]=;
}
else
{
if (!visited[m][n][num])
{
visited[m][n][num]=;
for (int k=; k<=; k++)
{
if (select_num(k,num,m))
{
int next=delete_head(num,m)*+k; //next是num的下个状态(去头加尾)
if (!visited[m][n-][next])
{
work(m,n-,next);
}
dp[m][n][num]+=dp[m][n-][next];
}
}
}
}
}
int main()
{
memset(visited,,sizeof(visited));
memset(dp,,sizeof(dp));
scanf("%d %d",&N,&M);
if (M==)
{
int ans=;
while (N>)
{
ans*=;
N--;
}
printf("%d\n",ans);
}
if (M==)
{
int ans=;
for (int i=; i<=; i++)
{
int num=i;
work(M,N-,num);
ans+=dp[M][N-][num];
}
printf("%d\n",ans);
}
if (M==)
{
int ans=;
for (int i=; i<=; i++)
for (int k=; k<=; k++)
{
int num=i*+k;
work(M,N-,num);
ans+=dp[M][N-][num];
}
printf("%d\n",ans);
}
if (M==)
{
int ans=;
for (int i=; i<=; i++)
for (int k=; k<=; k++)
for (int x=; x<=; x++)
{
int num=i*+k*+x;
work(M,N-,num);
ans+=dp[M][N-][num];
}
printf("%d\n",ans);
}
return ;
}
小明的密码-初级DP解法的更多相关文章
- scauoj 18025 小明的密码 数位DP
18025 小明的密码 时间限制:4000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC Description 小明的密码由N(1<=N& ...
- hdu 4521 小明系列问题——小明序列(线段树+DP或扩展成经典的LIS)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- [小明打联盟][斜率/单调队列 优化dp][背包]
链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...
- HDU 4511 小明系列故事——女友的考验 (AC自动机+DP)
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)
Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则: 1.如果小明 ...
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...
- HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)
小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU4511 小明系列故事——女友的考验 —— AC自动机 + DP
题目链接:https://vjudge.net/problem/HDU-4511 小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others) Memor ...
- FZU 2186 小明的迷宫 【压状dp】
Problem Description 小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫.因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷 ...
随机推荐
- dubbox 增加google-gprc/protobuf支持
好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...
- 在Eclipse中使用建立使用Gradle做依赖管理的Spring Boot工程
前述: Gradle存在很长时间了,以前只知道Maven和ivy ,最近才知道有这个存在,因为以后要用这个了; 所以,要先学会怎么用这个工具,就从建立一个简单工程开始! 实际上以前是见过Gradle的 ...
- Linq 单表城市级联
var list = (from province in db.Areas && province.IsDel == join city in db.Areas on province ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- centos tar压缩与解压缩命令大全
tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...
- win10 右键菜单添加Git Hash Here
1.通过在"运行"中输入'regedit',打开注册表. 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[Background] ...
- 【总结】富有表现力的JavaScript
1.JavaScript的灵活性 JavaScript是目前最流行.应用最广泛的语言之一,它是一种极富表现力的语言,它具有C家族语言所罕见的特性.这种语言允许我们使用各种方式来完成同一个任务或者功能, ...
- easyUI 如何不跳转页面,只是加载替换center部分内容
以前做的一个故障报修系统,前端框架使用easyUI框架,layout布局,center使用datagrid .点击左边树形菜单时时页面跳转,想要知道如何点击菜单时不进行页面跳转,而是只对center模 ...
- LR破解版录制手机脚本(一)模拟器录制
最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~! 其实自从LR12出来之 ...
- 在webapi2中使用OWIN 自寄宿模式
OWIN 自寄宿模式说的直白一点就是不需要IIS了,直接通过路由访问cs模式的服务 敲了一遍官方的例子,首先安装Microsoft.AspNet.WebApi.OwinSelfHost,注意不要安装 ...