sicily 2372. Non-Decreasing Digits【dp】

   第一次周赛的题目。感觉难的太难了。用了一个小时不到切掉3题。剩下时间就看题目了,题目晦涩难懂,结果都没动手写剩下的了。
  这道题意大概是Non-Decreasing Digits的定义为:这个数的每一位当前数字的左边数字都不大于当前数字。给定一个数的数字个数n,问有多少个n位的Non-Decreasing Digits(非降序数).
   用dp[i][j]表示i位数字最后一位为j时的非降序数的个数。
   首先n = 1时直接输出10(这点上开始还以为是0,结果wa了);
   当n = 2时,dp[2][j]=(j+1)*(j+2)/2;
  当n > 2时,dp[i][j]=dp[i][j-1]+dp[i-1][j];(期间想了一下就出来了,感觉不是太难想到)
  注意结果会爆int。
ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
// source code of submission 719823, Zhongshan University Online Judge System
#include < iostream >
#include
< cstring >

using namespace std;

long long dp[ 70 ][ 15 ];
int ca,n,t;

int main()
{
int i,j;

cin
>> t;

for (i = 1 ;i <= 64 ; ++ i)
for (j = 0 ;j <= 9 ; ++ j)
{
dp[i][j]
= 1 ;
}

for (i = 1 ;i <= 9 ; ++ i)
{
dp[
2 ][i] = ((i + 1 ) * (i + 2 )) / 2 ;
}

for (i = 3 ;i <= 64 ; ++ i)
{
for (j = 1 ;j <= 9 ; ++ j) dp[i][j] = dp[i - 1 ][j] + dp[i][j - 1 ];
}

while (t -- )
{
cin
>> ca >> n;

if (n == 1 ) cout << ca << " 10 " << endl;
else
cout
<< ca << " " << dp[n][ 9 ] << endl;

}

return 0 ;
}

转载于:https://www.cnblogs.com/keep-fighting/archive/2011/04/10/2011274.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值