第一次周赛的题目。感觉难的太难了。用了一个小时不到切掉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。
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;
}
posted on 2011-04-10 13:24  c++fans  阅读(443)  评论(0编辑  收藏  举报