第一次周赛的题目。感觉难的太难了。用了一个小时不到切掉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](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//
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 ;
}
#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 ;
}