hdu 1297
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1297
題意:n個字母,由F和M組成。F不能單獨存在。求滿足條件的字符串數目。
mark:遞推很容易得到方程dp[n] = 2*dp[n-1]-dp[n-2]+dp[n-3]。但是題目中n最大是1000,結果是200多位的整數,要寫成大數運算,大數減法沒寫過。。。方程可等價為dp[n] = dp[n-1]+dp[n-2]+dp[n-4],這樣就回避了減法的問題。
代碼:
# include <stdio.h># include <string.h>
char ans[1010][300] ;
int anum[300], bnum[300] ;
int c[300] ;
void strtonum(int num[], char s[])
{
int i ;
num[0] = strlen(s) ;
for (i = num[0] - 1 ; i>= 0 ; i--)
num[num[0]-i] = s[i]-'0' ;
}
void numtostr(char s[], int num[])
{
int i ;
s[num[0]] = '\0' ;
for (i = 1 ; i <= num[0] ; i++)
s[num[0]-i] = num[i]+'0' ;
}
void numadd(int a[], int b[])
{
int cc = 0 ;
int *p, *q, i ;
if (a[0] < b[0]) p = a, q = b ;
else p = b, q = a ;
for (i = 1 ; i <= q[0] ; i++)
{
if (i <= p[0])
c[i] = p[i]+q[i]+cc ;
else c[i] = q[i]+cc ;
cc = c[i] /10 ;
c[i] %= 10 ;
}
if (cc != 0) c[i++] = cc ;
c[0] = i-1 ;
for (i = 0 ; i <= c[0] ; i++)
a[i] = c[i] ;
}
void add(char a[], char b[])
{
strtonum(anum, a) ;
strtonum(bnum, b) ;
numadd(anum,bnum) ;
numtostr(a, anum) ;
}
int init()
{
int i ;
strcpy(ans[0], "1") ;
strcpy(ans[1], "1") ;
strcpy(ans[2], "2") ;
strcpy(ans[3], "4") ;
for(i = 4 ; i <= 1000 ; i++)
{
strcpy(ans[i], "0") ;
add(ans[i], ans[i-1]) ;
add(ans[i], ans[i-2]) ;
add(ans[i], ans[i-4]) ;
}
}
int main ()
{
int n ;
init() ;
while (~scanf ("%d", &n))
puts (ans[n]) ;
return 0 ;
}
轉載于:https://www.cnblogs.com/lzsz1212/archive/2012/02/14/2350235.html
總結
- 上一篇: 鼠标事件的
- 下一篇: 杭电2855 Fibonacci