日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1297

發布時間:2025/7/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的hdu 1297的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。