第一次周赛的题目。感觉难的太难了。用了一个小时不到切掉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;
}