hdu_1865 1sting

本文探讨了由1和2组成的数串通过两两相加形成新数的组合方式,利用动态规划解决计数问题,并提供了C++和Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1865

分析:

       题意分析:给你一些数串(只是由1,2组成),这些1两两相加(最大加到2)组成新的数,有几种。输入的数都是1.

       题解分析:

              设有n个1,可以构成f(n)种。则加一个1的时候,前面n种仍然成立 f(n+1)=f(n)+?;

               第n+1个1和第n个1相加构成2,前面n-1个1可以组合的个数。  f(n+1)=f(n)+f(n-1);

              故,递推公式: ans[i]=ans[i-1]+ans[i-2];

              因为n很大,__int64 都会溢出,用数组模拟或Java.

我的代码:

#include<stdio.h>
#include<string.h>
typedef __int64 LL;
int ans[205][501];
void add(int k)  //模拟加。
{
    int r=0;
    for(int i=500;i>=0;i--)
    {
        r=ans[k-1][i]+ans[k-2][i]+r;
        ans[k][i]=r%10;
        r/=10;
    }
}
int main()
{
    char str[250];
    ans[1][500]=1;
    ans[2][500]=2;
    for(int i=3;i<=205;i++) add(i);
    int t;
    scanf("%d",&t);

    while(t--)
    {
        scanf("%s",str);
        int len=strlen(str);
        int j;

         for( j=0;j<=500;j++) if(ans[len][j]) break;
        for(;j<=500;j++) printf("%d",ans[len][j]);
        printf("\n");

    }

    return 0;
}

总结:练习的时候本想用Java的,一时不会开Java的数组了 囧rz。。

练习后,又试了下Java.

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner cin = new Scanner(System.in);
		
		BigInteger[] ans = new BigInteger[205]; //忘记是这样开数组的。。
		ans[1]=BigInteger.valueOf(1);
		ans[2]=BigInteger.valueOf(2);
		for(int i=3;i<=200;i++) ans[i]=ans[i-1].add(ans[i-2]);
		
		int t=cin.nextInt();
		
		for(int i=0;i<t;i++)
		{
			String s;
			s=cin.next();  //不能用nextline();
			
			int n=s.length();
			System.out.println(ans[n]);
		}
		
	}
}


      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值