动态规划(6)——VF(NYOJ269)*

英文题目,比较难懂。大概意思:就是求1到10^9里的数满足每位相加之和等于s的数的个数。

比如1到10^9中的数满足每位相加起来都是1的有10个:1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000;

AC代码如下:

       看别人的,还不是太懂,先记下来,慢慢琢磨吧。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

#include<iostream>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

using
namespace std;

int dp[10][82];

int main()

{

    int
n;

    memset(dp,0,sizeof(dp));

    for(int
i=1;i<10;i++)

    {

        dp[1][i]=1;//1位数中每位相加为1……10的都是1个。

    }

    for(int
i=1;i<10;i++)//数的位数,从位数为1到位数为9

    {

        for(int
j=1;j<=i*9;j++)//某个数的各个位数相加之和为j,最大为9*9=81

        {

            for(int
k=0;k<=9&&k<=j;k++)//?

            {

                dp[i][j]+=dp[i-1][j-k];//?

            }

        }

    }

    while(scanf("%d",&n)!=EOF)

    {

        int
ans=0;

        if(n==1)//如和就是1,则就输出10就ok

        {

            printf("%d\n",10);

            continue;

        }

        else

        {

            for(int
i=1;i<10;i++)//不然将和为n的1到9位数的个数全都加起来

            {

                ans+=dp[i][n];

            }

            printf("%d\n",ans);

        }

    }

    return
0;

}

  


动态规划(6)——VF(NYOJ269)*

时间: 2024-10-21 01:02:05

动态规划(6)——VF(NYOJ269)*的相关文章

VF(动态规划)

VF 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Vasya is the beginning mathematician. He decided to make an important contribution to the science and to become famous all over the world. But how can he do that if the most interesting facts such as Pythagor

NYOJ-269 VF

VF 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Vasya is the beginning mathematician. He decided to make an important contribution to the science and to become famous all over the world. But how can he do that if the most interesting facts such as Pythagor

线性动态规划

准确来说,动态规划是一种思想,而不是一种算法.算导里将它归结为——高级程序设计技巧. 在线性结构上进行状态转移DP,统称线性DP. 线性DP最常见的有: 子集和问题,LIS问题,LCS问题. 拓展之后有:子段和问题,杂类问题. 1. 子集和问题和硬币计数问题 子集和问题的一个实例: 〈S,t〉.其中,S={ 1 x , 2 x ,…, n x }是一个正整数的集合,c是一个正整数.子集和问题判定是否存在S的一个子集S1,使得s1中的各元素之和等于c. 这其实就是0/1背包. 硬币计数问题的一个实

nyoj 0269 VF

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[

Leetcode 494 Target Sum 动态规划 背包+滚动数据

这是一道水题,作为没有货的水货楼主如是说. 题意:已知一个数组nums {a1,a2,a3,.....,an}(其中0<ai <=1000(1<=k<=n, n<=20))和一个数S c1a1c2a2c3a3......cnan = S, 其中ci(1<=i<=n)可以在加号和减号之中任选. 求有多少种{c1,c2,c3,...,cn}的排列能使上述等式成立. 例如: 输入:nums is [1, 1, 1, 1, 1], S is 3. 输出 : 5符合要求5种

活动选择的贪心算法与动态规划(未完成)

// greedy_algorithm.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; #define NofActivity 11 int c[NofActivity + 1][NofActivity + 1]; int reme[NofActivity + 1][NofActivity + 1]; //活动的

求不相邻金币相加和的最大值--动态规划1

求不相邻金币相加和的最大值. 输入n个金币的金币面值(正数自定义),求这些金币不相邻和的最大值. 动态规划问题1 设f(n)为第n个金币数的最大值,f(0)=0,f(1)=a[1],输入的数组从下标为1开始. f(n)=max{a[n]+f(n-2),f(n-1)}. 代码如下: import java.util.Scanner; public class Jin_bi_zui_da_zhi { public static void main(String[] args) { Scanner s

[动态规划] 黑客的攻击 Hacker&#39;s CrackDown Uva 11825

抽象为数学模型就是,  取尽可能多的互不相交的子集 ,  使得每一个子集都能覆盖全集 #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int n; int P[1000],cover[1000],f[1000]; int main(){ scanf("%d", &n); for (int i = 0; i < n;i++) {

Beauty Of algorithms(七)动态规划 钢条分割 矩阵链乘 最长公共子序列 最优二叉树

1.动态规划                动态规划的方法与方法类似,英文"dynamic programming",这里的programming不是程序的意思,而是一种表格法.都是通过组合子问题的解来解决原问题,分治方法将划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来求出原问题的解.与之相反动态规划应用于子问题的重叠情况,即不同的子问题具有公共的子问题,子问题的求解是递归进行 的,将其划分为更小的子问题,动态规划,每个子问题只求解一次,将其保存在表格中,从而无需每次求