数位dp
来源:互联网 发布:mac 解压rar文件命令 编辑:程序博客网 时间:2024/06/05 02:29
1. windy数。
题意:求给定区间范围内的,求相邻数位之差绝对值不小于2的数的个数。
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026
code:
#include<string.h>#include<stdio.h>#include<iostream>using namespace std;const int maxn = 12;int f[maxn][10];int d[maxn];bool check(int x, int y) { return x - y >= 2 || y - x >= 2;}void init() { memset(f, 0, sizeof(f)); for(int i = 0; i < 10; i++) f[1][i] = 1; for(int i = 2; i < maxn; i++) { for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { if(j == 0 || check(j, k)) f[i][j] += f[i-1][k]; } } }}int solve(int x) { int m = 0; if(x == 0) m = 1; memset(d, 0, sizeof(d)); while(x) { d[m++] = x % 10; x /= 10; } int ans = 0; for(int i = m - 1; i >= 0; i--) { for(int j = 0; j < d[i]; j++) { if(i == m - 1 || check(d[i+1], j)) ans += f[i+1][j]; } if(i != m - 1 && !check(d[i], d[i+1])) break; if(!i) ans++; } return ans;}int main() { int a, b; init(); while(~scanf("%d%d", &a, &b)) { printf("%d\n", solve(b) - solve(a-1)); }}
2. Investigating Div-Sum Property (UVA 11361)
#include<stdio.h>#include<string.h>const int maxn = 10;const int maxk = 90;int P[maxn];int f[maxn][maxk][maxk];int d[maxn];int A, B, K;void init() { P[0] = 1; for(int i = 1; i < maxn; i++) P[i] = P[i-1] * 10;}void calc() { memset(f, 0, sizeof(f)); f[0][0][0] = 1; for(int t = 1; t < maxn; t++) { for(int a = 0; a < maxk; a++) { for(int b = 0; b < maxk; b++) { for(int c = 0; c < 10; c++) { int ta = (a + c * P[t-1]) % K; int tb = (b + c) % K; f[t][ta][tb] += f[t-1][a][b]; } } } }}int solve(int x) { if(x == 0) return 1; memset(d, 0, sizeof(d)); int m = 0; while(x) { d[m++] = x % 10; x /= 10; } int ans = 0; int pExp, pSum; pExp = pSum = 0; for(int i = m - 1; i >= 0; i--) { for(int j = 0; j < d[i]; j++) { int a = (K - (pExp + j * P[i]) % K) % K; int b = (K - (pSum + j) % K ) % K; ans += f[i][a][b]; } pExp = (pExp + P[i] * d[i]) % K; pSum = (pSum + d[i]) % K; if(i == 0 && pExp == 0 && pSum == 0) ans++; } return ans;}int main() { init(); int kase; scanf("%d", &kase); while(kase--) { scanf("%d%d%d", &A, &B, &K); int ans = 0; if(K < maxk) { calc(); ans = solve(B) - solve(A-1); } printf("%d\n", ans); } return 0;}
0 0
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 数位dp
- 数位dp
- 数位DP
- 数位dp
- 数位DP
- 【数位DP】
- 数位DP
- 数位dp
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 数位DP
- 数位DP
- Android wifi探究二:Wifi framework层源码分析
- launch mode应用场景
- spring下的resful接口开发
- 数据结构之队列
- 对象的克隆——原型模式
- 数位dp
- android 开发 在dos下adb logcat命令的详解
- Android 使用MediaPlayer播放assets目录的音频文件
- CollapsingToolbarLayout
- UNIX套接字编程中如何打开和关闭DF标志
- orcale自带的uuid生成
- C#:ClassLibrary to DLL by VS or CSC
- Ubuntu使用教程
- linux环境变量设置方法总结(PATH/LD_LIBRARY_PATH)