Light OJ 1158 Anagram Division(状压+数位DP)
来源:互联网 发布:跟兄弟连学php老版视频 编辑:程序博客网 时间:2024/06/03 17:24
题意:给你一个字符串s,s中只包含数字,问s的所有排列所形成的数字中有多少能被d整除。
解析:数位和状压还是容易想到的,问题是怎么压缩状态,这里的状态不能用多进制记录出现次数,但因字符串的长度<=10,所以将字符串排序后,利用二分确定数字位置并判是否溢出,从而完成状态的转移。
[code]:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,d,dp[1<<10][1001];char s[15];int dfs(int S,int m){ if(S == (1<<n)-1) return m==0; if(dp[S][m]!=-1) return dp[S][m]; int i,j,p,res = 0; for(i = 0;i <= 9;i++){ p = lower_bound(s,s+n,'0'+i)-s; for(j = p;s[j]=='0'+i;j++){ if(!(S>>j&1)) break; } if(s[j]=='0'+i) res += dfs(S|(1<<j),(m*10+i)%d); } return dp[S][m] = res;}int main(){ int i,j,cas,T; scanf("%d",&cas); for(T = 1;T <= cas;T++){ scanf("%s%d",s,&d); n = strlen(s); sort(s,s+n); memset(dp,-1,sizeof(dp)); printf("Case %d: %d\n",T,dfs(0,0)); } return 0;}
0 0
- Light OJ 1158 Anagram Division(状压+数位DP)
- Light oj 1158 - Anagram Division(状压+记忆化)
- lightoj 1158 - Anagram Division 状压DP
- light oj 1032 数位DP
- light OJ 1205 数位DP
- light OJ 1068 数位DP
- light oj 1140 数位dp
- light oj 1068(数位dp)
- light oj 1032(数位dp)
- Light OJ 1205-Palindromic Numbers-数位DP
- Light oj 1068 - Investigation(数位dp)
- Light OJ 1068 Investigation (数位DP)
- Light OJ 1205 Palindromic Numbers (数位DP)
- lightoj 1158 - Anagram Division
- light--oj--1214-- Large Division
- light oj 1214 Large Division
- [light oj 1032]Fast Bit Calculations[数位DP]
- Light oj 1032 - Fast Bit Calculations(数位dp)
- 学习CUDA--硬件的简单学习
- CF611D 【分割字符串使得形成的数字数组呈递增状态】的方法数
- android下载网络数据的几种方法
- 动态加载jar文件
- 关于coursera上Learning How to Learn课程的读书笔记
- Light OJ 1158 Anagram Division(状压+数位DP)
- 干货!谷歌推荐的技术能力提升指南
- GCD线程的应用
- mysql 插入效率问题
- 二级指针
- 页面居中总结
- 2016 MCM/ICM E 题渣渣论文
- 编程的一些思考
- 步进电机基础知识和基本应用