51nod 1043 幸運號碼(數位DP)
阿新 • • 發佈:2018-02-28
std mod 題解 quest 求和 nco cin pre clas
題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043
題目:
1個長度為2N的數,如果左邊N個數的和 = 右邊N個數的和,那麽就是一個幸運號碼。 例如:99、1230、123312是幸運號碼。 給出一個N,求長度為2N的幸運號碼的數量。由於數量很大,輸出數量 Mod 10^9 + 7的結果即可。 Input 輸入N(1<= N <= 1000) Output 輸出幸運號碼的數量 Mod 10^9 + 7 Input示例 1 Output示例 9 題解:dp[i][j]表示長度為i,各位數之和為j的號碼的數量(包括前導0),狀態轉移方程:dp[i][j]=dp[i][j]+dp[i-1][j-k]。最後計算的時候前半部分需要減掉前導0,後半部分不用,然後從0到9*n的對應值相乘求和。1#include <iostream> 2 using namespace std; 3 4 typedef long long LL; 5 const int N=1234; 6 const LL mod=1e9+7; 7 LL dp[N][9*N]; 8 9 int main(){ 10 int n; 11 LL ans=0; 12 cin>>n; 13 dp[0][0]=1; 14 for(int i=1;i<=n;i++) 15 for(int j=0;j<=9*n;j++)16 for(int k=0;k<=9;k++) 17 if(j>=k) dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod; 18 else break; 19 20 for(int i=0;i<=9*n;i++){ 21 ans=(ans+(dp[n][i]-dp[n-1][i])*dp[n][i]%mod)%mod; 22 } 23 cout<<ans<<endl; 24 return 0; 25 }
51nod 1043 幸運號碼(數位DP)