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。
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 ;
}

你可能感兴趣的:(git)