POJ—1953和POJ—2506(找规律,递推题目)

目录

POJ—1953

POJ——2506


POJ—1953

POJ 1953题目链接:http://poj.org/problem?id=1953

题意就是给定一个正整数n,让你找出n位二进制数中,确定不包含相邻1的n位序列的个数。

Sample Input

2
3
1

Sample Output

Scenario #1:
5

Scenario #2:
2

注意每个输出之间用空行隔开。(交的时候PE一次) 

正确思路:这种题目很可能就是递推找规律的题,多写几个就会发现答案呈斐波那契数列的形式,即,0,2,3,5,8,13,21....

 

 自我反思:(这是我们算法老师留的题目,因为刚学动态规划我以为是这类的题目,想了一下找不出状态方程,后来我又想是不是能一个个的计算出来,就相当于n个空位填1,想了半天,我甚至还想了最多能填几个1...后来算着算着发现数越大越复杂不好算,后来甚至有想看题解的冲动,后来我又写了几个数,有望dp递推方程的方向想,后来稀里糊涂的居然推出了斐波那契数列的公式.......其实应该写出几个数就能发现规律的,但是刚开始的时候一心想计算出来,根本没往找规律的方向想....套泥猴子的我傻吊了,总结一下还是做题做的太少了没有感觉,而且思路不活,总是一个思路走到底.....)

#include
#include
using namespace std;

int dp[50];
int Fib(int n)
{
    if(n==0) return 0;
    if(n==1)return 2;
    if(n==2) return 3;
    for(int i=3;i<=n;i++)
        dp[i]=dp[i-1]+dp[i-2];
    return dp[n];
}
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin>>t;
    memset(dp,0,sizeof(dp));
    dp[1]=2;
    dp[2]=3;
    for(int i=1;i<=t;i++)
    {
        cout<<"Scenario #"<>n;
        cout<

POJ——2506

题目链接:http://poj.org/problem?id=2506

Description

In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? 
Here is a sample tiling of a 2x17 rectangle. 

Input

Input is a sequence of lines, each line containing an integer number 0 <= n <= 250.

Output

For each line of input, output one integer number in a separate line giving the number of possible tilings of a 2xn rectangle. 

Sample Input

2
8
12
100
200

Sample Output

3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251

题意:输入一个数n,问可以将2xn矩形划分成为2x1或2x2的方法有多少种。

思路:这也是一个找规律的题目,很显然算是不能算出来的数太大了。规律就是 dp[ i ]= dp[ i-1 ]+ 2 *dp[ i-2 ]  即,1,1,3,5,11,21...看输出数据要用JAVA大数去做。

用java交题时注意:

1.删除代码中的package xxx;包语句
2.public class Main{

}
类名一定要写成Main,改这两处即可正常运行提交

 自我反思:(做完上面那个题后很容易就去找规律了,本题思路出的很快,但是卡住最长的时候是在写代码。java好久不用了,突然要用还要去网上查用法...最近要把JAVA和数据结构好好复习复习了.第一次交的时候是不知道java交题的规矩,后来是因为自己的ifelse语句写错了WA了很多次,这题可以开个数组预处理的,这样多组输入就不用每次都要算一遍了,我自己的代码很烂,随便写的)。

//可以开个数组提前预处理
import java.util.*;
import java.math.*;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n;
		while(in.hasNextInt()) {
			n=in.nextInt();
			BigInteger a= new BigInteger("1");
			BigInteger b= new BigInteger("3");
			BigInteger c = null;
			BigInteger d=new BigInteger("2");
			if(n>=0&&n<=2) {
				if(n==0)
					System.out.println("1");
				if(n==1)
					System.out.println(a);
				if(n==2)
					System.out.println(b);
			}
			else {
			for(int i=3;i<=n;i++) {
				c=(a.multiply(d)).add(b);
				a=b;
				b=c;
			}
			System.out.println(b);
			}
			
		}
	}
}

 

你可能感兴趣的:(基础算法)