zoukankan      html  css  js  c++  java
  • ural 1009 (dp 水题)

    题意:输入n和k,表示一个n位的k进制数,这个数字要符合两个条件,没有前导0(否则怎么算是n位数呢?),不能有两个或以上连续的0,问你一共有多少个这样的n位的k进制数

    思路:n位可以 由 n - 1 位 推出 所以 是 dp

           因为不能有两个或以上的连续的0 ,所以就 分为 ,最后一位 为0  和 不为0 的情况 dp[i][0] 表示前 i位 k 进制 数 最后一位 位0 的个数, dp[i][1] 表示最后一位不为0 的个数

         状态转移方程:

         dp[i][0] = dp[i][1] ;

        dp[i][1] = (k - 1)*(dp[i][0] + dp[i][1]) ;

       初始化时  dp[1][0] = 0,dp[1][1] = k - 1;

                   对于 dp[2][0] = dp[1][1],dp[2][1] = dp[1][1]*(k - 1) ;

      此题如果改为 3 个不连续为0 ,同样可以根据这样的逻辑列出转移方程

    #include <iostream>
    #include<cstdio>
    #define ll long long
    
    using namespace std;
    long long dp[20][2] ;
    int main()
    {
        int n,k,i;
        while(scanf("%d%d",&n,&k)!=EOF)
        {
    
           dp[1][0] = 0;
           dp[1][1] = k - 1;
           dp[2][0] = dp[1][1] ;
           dp[2][1] = dp[1][1]*(k - 1) ;
           for( i = 2; i <= n;i++)
           {
             dp[i][0] = dp[i - 1][1] ;
             dp[i][1] = (dp[i - 1][0]  + dp[i - 1][1])*(k - 1) ;
           }
    
           printf("%lld\n",dp[n][0] + dp[n][1]) ;
    
    
        }
    }
    
  • 相关阅读:
    Java 内部类
    Java 包 和导入
    Java 访问控制权限
    java 面向对象-- this 关键字
    java 面向对象-- 构造方法
    java 用递归函数实现斐波那契数列 1、1、2、3、5、8、13、21
    Java面向对象-static静态方法与普通方法
    常用模块(time)
    模块安装及导入
    python之OS模块详解
  • 原文地址:https://www.cnblogs.com/acSzz/p/3072887.html
Copyright © 2011-2022 走看看