zoukankan      html  css  js  c++  java
  • nyoj 0269 VF(dp)

    nyoj 0269 VF

    意思大致为从1-10^9数中找到位数和为s的个数

    分析:利用动态规划思想,一位一位的考虑,和s的范围为1-81

      状态定义:dp[i][j] = 当前所有i位数的和为j的个数

      除了最高位的取值为1-9(最高位不能为0),其余位的取值都为0-9,所有我们可以最开始初始化dp[1][j](1 <= j <= 9) = 1.假如我们求dp[5][9]当前所有5位数的和为9的个数,那么我们需要考虑0-9这10个数的情况,

      如果此时个位(即第5位)的值为6,那么我们需要得知dp[4][9-6]的值,因为和为9,且此时个位(第五位)为6,那么前4个数和必须为3才满足和为9,那么dp[5][9] += d[5-1][9-6]; 

      由此很容易得到状态转移方程:dp[i][j] = dp[i-1][j-k];

      注意!!!:1000000000不能忽视,最后和为1的结果必须再加1;

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int dp[10][81];
    int main() {
        memset(dp, 0, sizeof(dp));
        for(int i = 1; i <= 9; i++) dp[1][i] = 1;
        for(int i = 2; i < 10; i++) {
            int c = i*9;
            for(int j = 1; j <= c; j++) {
                for(int k = 0; k < j && k <= 9; k++) 
                    dp[i][j] += dp[i-1][j-k];
            }
        }
        for(int i = 2; i <= 9; i++) {
            for(int j = 1; j <= 81; j++)
                dp[i][j] += dp[i-1][j];    
        }
        dp[9][1]++;//1000000000的情况 
        int s;
        while(scanf("%d", &s) == 1) printf("%d
    ", dp[9][s]);
        return 0;
    } 
    作者:kindleheart
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    网站迁移服务器后CPU、内存飙升,设置robots.txt 问题
    System.Web.Mvc 找到的程序集清单定义与程序集引用不匹配
    滑动窗口协议
    TCP拥塞控制
    计网常用协议
    TCP协议中的三次握手、四次挥手
    浏览网页的详细过程
    docker网络模式
    openstack网络
    查找算法
  • 原文地址:https://www.cnblogs.com/kindleheart/p/8955758.html
Copyright © 2011-2022 走看看