思路:
1.設d[i]
是恰好用完i根
火柴所獲得的數字種數,設c[i]
是用i
根火柴可以搭出的數字(單個數字0~9
);則有c[8]=
;
2.我們首先將d[i]
初始化,讓搭完乙個數字的情況先存在d[i]
中,目的就是第乙個數字不搭0
;則此時d=
;
3.我們已知搭乙個數字至少需要兩根火柴,最多需要7
根,我們從i=2
開始遍歷d[i]
,則有d[i+j]=d[i+j]+d[i]*c[j] (2<=j<=7)
,意思是在d[i]
搭好的數字後面繼續可以新增c[j]
個數字,既然字首有d[i]
種,那組合起來就是d[i]*c[i]
種了;
4.注意在最後輸出的時候,如果n>=6
,我們要將結果+1
輸出,因為有單個0
的情況;
5.要使用高精度進行計算,這種規模即使是unsigned long long
也遠遠不夠qaq
**:
#include
using
namespace std;
struct bigint
bigint
(int v)
while
(v);
}bigint
(const
char s)
} bigint operator+(
const bigint &b)
const
if(res.a[res.len]
>
0)res.len++
;return res;
} bigint operator*(
const bigint &b)
const
if(up)res.a[i+b.len]
=up;
} res.len=len+b.len;
while
(res.a[res.len-1]
==0&&res.len>
1)res.len--
;return res;
}void
output()
};const
int maxn=
2005
;int dat[8]
=;bigint d[maxn]
,c[8
],sum[maxn]
;void
init_()
for(
int i=
2;ifor(
int i=
1;i) sum[i]
=sum[i-1]
+d[i];}
intmain()
return0;
}
題解 UVA11375 遞推
題目鏈結 參考了大佬部落格思路摘抄如下 d i 記錄用i跟火柴可以組成多少種數字,更新式是d i c j d i c j 就是組成數字j要用的火柴數。但是不能以0開頭,最後當火柴數大於等於6的時候就可以在總答案上 1,表示可以構成乙個單獨的0 因為之前沒有0開頭的,所以要 1補回來 最後答案就是f ...
UVA11375火柴 遞推 大數
題意 給你n根火柴,問你能組成多少種數字,比如3根可以組成1或者7,組成的數字中不能有前導0,思路 我們開乙個陣列,d i 記錄用i跟火柴可以組成多少種數字,則更新狀態是這樣的 d i c j d i c j 就是組成數字j要用的火柴數,這樣跟新相當於是在模擬寫數字,但是有一點就是不能以0開頭,左後...
uva11375火柴遞推之多狀態轉移遞推
分析 把 已經使用過的火柴數i 看成狀態,可以得到乙個圖。從前往後每新增乙個數字x,就從狀態i轉移到i c x 其中c x 代表數字x需要的火柴數。當i 0的時候不允許 使用數字0 最後當n 6時,給答案單獨加上1,代表整數0 令d i 為從結點0到結點i的路徑條數,則答案f n d 1 d 2 d...