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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值