幸運號碼
思路:傳說中的數字dp;
不難發現,n(n<1000) ,那麼,n個數的最大和為9*1000=9000;
對於9000*1000的時間範圍,我們可以用dp來解決;
dp[i][j],表示第i為數總和為j的號碼的個數;
每個dp[i][j]都是dp[i-1][j-v](0<=v<=9) 的總和;
然後按照左邊的n和右邊的n,分為有前導0,和沒有前導0進行dp;
然後輸出排列的答案即可;
dp[1000][9000]*2會爆空間,所以我選擇壓掉i維;
來,上**:
#include #include#include
using
namespace
std;
#define ri 9005
#define mod 1000000007
long
long n,dp[9005],ans,f[9005
];int
main()
else
break
; }
f[j]=fpos,dp[j]=dpos;}}
for(int i=1;i<=9*n;i++) ans=(ans+(dp[i]*f[i])%mod)%mod;
cout
}
幸運號碼(51nod
1個長度為2n的數,如果左邊n個數的和 右邊n個數的和,那麼就是乙個幸運號碼。例如 99 1230 123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod 10 9 7的結果即可。題目解法 簡單dp 設出陣列dp dp i j 表示第i個數的和為j的個數 首...
51NOD 1043 幸運號碼
基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 1個長度為2n的數,如果左邊n個數的和 右邊n個數的和,那麼就是乙個幸運號碼。例如 99 1230 123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod 10 9 7的結果...
51nod 1043 幸運號碼 (數字dp)
dp i j 表示 i 個數和為 j 的總數 包含0開頭情況 dp i j dp i 1 j k i 1 這裡用滾動陣列節省記憶體 非0開頭的情況 0開頭的情況 dp n 1 i dp n 1 1 i dp n 1 i 最後將其累加即為結果。開始沒有想到這麼做,還傻傻的dfs,用dp 1000 10...