ural 1009. K-based Numbers(简单dp)
2014-04-15 21:23
363 查看
http://acm.timus.ru/problem.aspx?space=1&num=1009
题意:将一个n位数转化为合法的K进制数,有多少种情况。合法的K进制数即不含前导0,且任意两个0都不相邻。
思路:每一位的情况都分为:小于K且不等于0的情况或等于0的情况,每一位的选择都有前一位决定。dp[i][0]表示第i位为0的情况,dp[i][1]表示第i位不为0的情况,则
dp[i][0] = dp[i-1][1],dp[i][1] = (dp[i-1][1]+dp[i-1][0])*(k-1) (若第i位不为0,则第i位有k-1种情况),最后的n位合法的k进制数就有 dp
[0]+dp
[1] 种。
View Code
题意:将一个n位数转化为合法的K进制数,有多少种情况。合法的K进制数即不含前导0,且任意两个0都不相邻。
思路:每一位的情况都分为:小于K且不等于0的情况或等于0的情况,每一位的选择都有前一位决定。dp[i][0]表示第i位为0的情况,dp[i][1]表示第i位不为0的情况,则
dp[i][0] = dp[i-1][1],dp[i][1] = (dp[i-1][1]+dp[i-1][0])*(k-1) (若第i位不为0,则第i位有k-1种情况),最后的n位合法的k进制数就有 dp
[0]+dp
[1] 种。
#include <stdio.h> #include <string.h> const int N=20; int dp [2]; int main() { int n,k; while(~scanf("%d",&n)) { scanf("%d",&k); dp[1][0] = 0; dp[1][1] = k-1; for (int i = 2;i <= n; i++) { dp[i][0] = dp[i-1][1]; dp[i][1] = (k-1)*(dp[i-1][0]+dp[i-1][1]); } int ans = dp [0]+dp [1]; printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- ural 1009. K-based Numbers - dp
- ural 1009. K-based Numbers(dp)
- URAL - 1009 - K-based Numbers (简单DP)
- URAL 1009. K-based Numbers(简单递推)
- Ural-1009. K-based Numbers(简单组合数)
- URAL1009 K-based Numbers,简单DP
- URAL 1108 简单的树形dp背包问题
- URAL 1081. Binary Lexicographic Sequence(简单dp)
- URAL1009——DP——K-based Numbers
- Ural 1009. K-based Numbers DP
- Timus Online Judge1009---K-based Numbers(简单递推dp)
- URAL1009 - K-based Numbers - 数位dp
- URAL 1114 Boxes(简单dp)
- URAL 1009. K-based Numbers
- URAL 1009 K-based numbers(DP递推)
- URAL 1635. Mnemonics and Palindromes(简单区间dp)
- 递推DP URAL 1009 K-based Numbers
- ural1073 简单dp
- URAL 1152 False Mirrors(简单的状态压缩dp)
- URAL 1225 Flags 简单DP,一重循环