URAL 1353 Milliard Vasya's Function dp练习
2015-08-27 19:08
615 查看
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 is to think out something his own, original. So he thought out the Theory of Vasya’s Functions. Vasya’s Functions (VF) are rather simple: the value
of the Nth VF
in the point S is
an amount of integers from 1 to N that
have the sum of digits S.
You seem to be great programmers, so Vasya gave you a task to find the milliard VF value (i.e. the VF with N =
10 9) because Vasya himself
won’t cope with the task. Can you solve the problem?
题目弄了半天才懂,就是求10的9次以内各个位数上的数字加起来是s的数字一共有多少个
于是乎简单的dp就好
对于第 I 位 总数加起来为 J 的状态 如果第 i-1为是0 那么就加上dp[i-1][j] 相同于把第i-1位上的数放大第i 位 并在第I位上放0,
如果i-1位不是0 那么dp[i][j] 加上 dp[i-1][j-k] k为1 - 9的每个数字
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[11][90];
int s;
int main()
{
for(int i = 1; i <= 10; i++)
for(int j = 1; j <= 81; j++)
dp[i][j] = 0;
for(int i = 1; i <= 9; i++) dp[1][i] = 1;
for(int i = 2; i <= 9; i++)
{
for(int j = 1; j <= 81; j++)
{
dp[i][j] = dp[i-1][j];
for(int k = 1; k <= 9; k++)
{
if(j - k >= 0)
{
dp[i][j] += dp[i-1][j-k];
}
}
}
}
while(scanf("%d",&s)!=EOF)
{
int ans = 0;
if(s == 1) ans++;
for(int i = 1; i <= 9; i++)
{
ans += dp[i][s];
}
printf("%d\n",ans);
}
return 0;
}
But how can he do that if the most interesting facts such as Pythagor’s theorem are already proved? Correct! He is to think out something his own, original. So he thought out the Theory of Vasya’s Functions. Vasya’s Functions (VF) are rather simple: the value
of the Nth VF
in the point S is
an amount of integers from 1 to N that
have the sum of digits S.
You seem to be great programmers, so Vasya gave you a task to find the milliard VF value (i.e. the VF with N =
10 9) because Vasya himself
won’t cope with the task. Can you solve the problem?
题目弄了半天才懂,就是求10的9次以内各个位数上的数字加起来是s的数字一共有多少个
于是乎简单的dp就好
对于第 I 位 总数加起来为 J 的状态 如果第 i-1为是0 那么就加上dp[i-1][j] 相同于把第i-1位上的数放大第i 位 并在第I位上放0,
如果i-1位不是0 那么dp[i][j] 加上 dp[i-1][j-k] k为1 - 9的每个数字
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int dp[11][90];
int s;
int main()
{
for(int i = 1; i <= 10; i++)
for(int j = 1; j <= 81; j++)
dp[i][j] = 0;
for(int i = 1; i <= 9; i++) dp[1][i] = 1;
for(int i = 2; i <= 9; i++)
{
for(int j = 1; j <= 81; j++)
{
dp[i][j] = dp[i-1][j];
for(int k = 1; k <= 9; k++)
{
if(j - k >= 0)
{
dp[i][j] += dp[i-1][j-k];
}
}
}
}
while(scanf("%d",&s)!=EOF)
{
int ans = 0;
if(s == 1) ans++;
for(int i = 1; i <= 9; i++)
{
ans += dp[i][s];
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- eclipse 开发环境配置
- Unity3d镜头范围内移动。
- 包含min函数的桟
- 网卡驱动程序设计
- oracle 10g 实例用localhost无法访问的处理
- oracle 10g 实例用localhost无法访问的处理
- css3用图片作边框
- 理解RESTful架构
- acm hdu p1002 A + B Problem II
- iOS中Schema调起APP
- php大力力 [028节] 如何下载js文件,网上一个*.js无法下载啊??????
- UVa_Live 3664(精度坑)
- 使用logrotate配置Nginx日志轮替
- UITableView的编辑
- 一个Hibernate小程序
- python 高级属性
- 程序员,请远离拖延症!
- CTR预估中GBDT与LR融合方案
- OC开发_整理笔记——友盟分享(社交化组件)
- wait和sleep