目录
POJ—1953
POJ——2506
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<
题目链接: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);
}
}
}
}