URAL 1353 Milliard Vasya's Function DP

题目:click here

分析:dp[i][j] 表示i位数字,当前数字和为j的个数。dp[i][j] = dp[i-1][j] + dp[i-1][j-k] 前面表示在i-1位数后面加零,后面表示在前一位前面加k这个数。(注意k的取值范围)。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 int s;
 5 int dp[11][83];
 6 int cnt[83];
 7 void pre()  {
 8     memset( dp, 0, sizeof(dp) );
 9     memset( cnt, 0, sizeof(cnt) );
10     for( int j=1; j<=9; j++ ) dp[1][j] = 1;
11     for( int i=2; i<10; i++ )
12         for( int j=1; j<82; j++ )
13             for( int k=j; k>0&&j-k<10; k-- )
14                 dp[i][j] += dp[i-1][k];
15     cnt[1] = 10;
16     for( int i=2; i<82; i++ )
17         for( int j=1; j<10; j++ )
18             cnt[i] += dp[j][i];
19
20 }
21
22 int main()  {
23     pre();
24     while( ~scanf("%d", &s ) )   {
25         printf("%d\n", cnt[s] );
26     }
27     return 0;
28 }

URAL 1353 Milliard Vasya's Function DP

时间: 2024-11-29 09:05:34

URAL 1353 Milliard Vasya's Function DP的相关文章

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <

递推DP URAL 1353 Milliard Vasya&#39;s Function

题目传送门 1 /* 2 题意:1~1e9的数字里,各个位数数字相加和为s的个数 3 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 4 状态转移方程:dp[i][j] += dp[i-1][j-k],为了不出现负数 5 改为:dp[i][j+k] += dp[i-1][j] 6 */ 7 #include <cstdio> 8 #include <cstring> 9 #include <cmath> 10 #include <algorithm

ural 1353. Milliard Vasya&#39;s Function

点击打开链接 1353. Milliard Vasya's Function Time limit: 1.0 second Memory limit: 64 MB 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

Ural 1353 Milliard Vasya&amp;#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j].表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说.总能够看成在前i-1位后面加上一个0~9.所以状态转移方程就非常easy出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计就可以. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #inclu

timus.1353. Milliard Vasya&#39;s Function 动态规划

题目传送门 题目大意: 输入一个1到81(9*9)的数字s,求在1到109有多少个数字的数位和等于s. 解题思路: 我们很容易知道一位数字等于s的个数.要使一个i位的数字数位和等于s,可以通过一个i-1位的数字后面加上0~9(如果s<9就是0~s).于是很容易得出方程 dp[i][j]=dp[i-1][j-0]+dp[i-2][j-1]+……+dp[i-9][j-9];其中i表示i位的数字,j表示s.dp[i][j]表示一个i位数字数位和为j的方案数. #include <iostream&g

URAL1353——DP——Milliard Vasya&#39;s Function

Description 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’s theorem are already proved?

URAL1353---Milliard Vasya&#39;s Function(简单数位dp)

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's theorem are already proved? Correct! He

Ural 1635 Mnemonics and Palindromes(DP)

题目地址:Ural 1635 又是输出路径的DP...连着做了好多个了.. 状态转移还是挺简单的.要先预处理出来所有的回文串,tag[i][j]为1表示字符串i--j是一个回文串,否则不是回文串.预处理时要用n^2的方法,即枚举回文串中间,可以分奇数和偶数两种分别求一次. 然后dp转移方程为,若tag[j][i]==1,dp[i]=min(dp[i],dp[j-1]+1); 对于最令人讨厌的路径输出,可以用pre来记录回文串前驱分裂点,然后根据这些分裂点来输出. 代码如下: #include <

Ural 1260 A nudnik photographer(DP)

A nudnik photographer 大意: 对1到N这些数进行排列,1必须要在最左边,相邻的两个数之间的差值不能超过2,问有多少种排列的方法. 思路: 对座位进行DP,当第一个是1,第二个是2的时候,组合为dp[i-1]:当第一个是1,第二个是3的时候,第三个也确定了是2,组合为dp[i-3]:还有最后一种情况是1357--8642. 所以DP方程为dp[i] = dp[i-1]+dp[i-3]+1. #include <stdio.h> int n; int dp[100]; int