1
10
動態規劃!
如果找不到狀態轉移方程,直接遞歸求值,再打表!別怕麻煩哦!
遞歸代碼:
#include#include #define M 1000000000 __int64 num[85]; void fun(__int64 a,__int64 sum,__int64 m) { if(sum>M) return; __int64 i; num[m]++; for(i=0;i<=9;i++) { fun(i,sum*10+i,m+i); } } int main() { __int64 n,i; memset(num,0,sizeof(num)); for(i=1;i<=9;i++) { fun(i,i,i); } while(~scanf("%I64d",&n)) { printf("%I64d\n",num[n]); } return 0; }
打表:
AC碼:
#includeint f[82]={1,10,45,165,495,1287,3003,6435,12870,24310,43749,75501,125565,202005,315315,478731,708444,1023660,1446445,2001285,2714319,3612231,4720815,6063255,7658190,9517662,11645073,14033305,16663185,19502505,22505751,25614639,28759500,31861500,34835625,37594305,40051495,42126975,43750575,44865975,45433800,45433800,44865975,43750575,42126975,40051495,37594305,34835625,31861500,28759500,25614639,22505751,19502505,16663185,14033305,11645073,9517662,7658190,6063255,4720815,3612231,2714319,2001285,1446445,1023660,708444,478731,315315,202005,125565,75501,43749,24310,12870,6435,3003,1287,495,165,45,9,1}; int main() { int n; while(~scanf("%d",&n)) { printf("%d\n",f[n]); } return 0; }
動態規劃!
AC碼:
#includeint dp[10][82]; void DP() { int i,j,k; for(i=1;i<10;i++) dp[1][i]=1; for(i=1;i<10;i++) {// i表示有i位數字時 for(j=1;j<=9*i;j++) {// j表示變化范圍,當有i位數時,j的范圍[1,9*i] for(k=0;k<10&&k<=j;k++) { dp[i][j]+=dp[i-1][j-k]; } } } } int main() { int n,i,ans; DP(); while(~scanf("%d",&n)) { if(n==1) printf("10\n"); else { ans=0; for(i=1;i<10;i++) ans+=dp[i][n]; printf("%d\n",ans); } } return 0; }