递归--练习11--noi9273 PKU2506Tiling

递归--练习11--noi9273 PKU2506Tiling

一、心得

 25 a[i]%=10;(高精度时)
 26 这里错了,花了好久改好
 27
 28
 29 int* f(int n){
 30     if(dp[n][0]!=0) return dp[n];
 31     else if(0==n) return dp[0];
 32     else if(1==n) return dp[1];
 33     else{
 34
 35         give(jia(f(n-1),chen(f(n-2),2)),dp[n]);
 36         return dp[n];
 37     }
 38 }
 39 直接这样写的话f(n-1)那些的值一直被改变 ,指针需要去看看
 40 二维指针就是地址
 41
 42 整个测试有多组数据,请做到文件底结束。
 43 while(scanf("%d",&n)!=EOF){

二、题目

9273:PKU2506Tiling

总时间限制: 
2000ms

单个测试点时间限制: 
1000ms

内存限制: 
131072kB
描述

对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。

下图是一个2行17列的走道的某种铺法。

输入

整个测试有多组数据,请做到文件底结束。每行给出一个数字N,0 <= n <= 250

输出

如题

样例输入
2
8
12
100
200
样例输出
3
171
2731
845100400152152934331135470251
1071292029505993517027974728227441735014801995855195223534251

三、AC代码

  1 /*
  2 noi9273 PKU2506Tiling
  3
  4 就是好好找子问题就好了
  5
  6 找出递推关系式即可:
  7 第一块1*2横放:
  8 f(n)=f(n-2)
  9 第一块1*2竖放:
 10 f(n)=f(n-1)
 11 第一块2*2:
 12 f(n)=f(n-2)
 13
 14 故f(n)=f(n-1)+2*f(n-2);
 15 边界条件
 16 f(0)=1
 17 f(1)=1
 18 f(2)=3
 19
 20 高精度 (用个2维数组把每一个数的每一位都存下来即可)
 21 其实加和乘里面只需要有加,因为乘2完全可以看成想加
 22 记忆化递归
 23
 24
 25 a[i]%=10;
 26 这里错了,花了好久改好
 27
 28
 29 int* f(int n){
 30     if(dp[n][0]!=0) return dp[n];
 31     else if(0==n) return dp[0];
 32     else if(1==n) return dp[1];
 33     else{
 34
 35         give(jia(f(n-1),chen(f(n-2),2)),dp[n]);
 36         return dp[n];
 37     }
 38 }
 39 直接这样写的话f(n-1)那些的值一直被改变 ,指针需要去看看
 40 二维指针就是地址
 41
 42 整个测试有多组数据,请做到文件底结束。
 43 while(scanf("%d",&n)!=EOF){
 44 */
 45 #include <iostream>
 46 #define Max 300
 47 using namespace std;
 48 int dp[Max][Max];//用个2维数组把每一个数的每一位都存下来
 49 //打印结果
 50 void print(int dp[]){
 51     for(int i=dp[0];i>=1;i--){
 52         cout<<dp[i];
 53     }
 54     cout<<endl;
 55 }
 56 //高精度乘单精度
 57 int* chen(int a[],int b){
 58     //乘
 59     for(int i=1;i<=a[0];i++){
 60         a[i]*=b;
 61     }
 62     //处理进位
 63     for(int i=1;i<=a[0];i++){
 64         if(a[i]>=10){
 65             a[i]%=10;
 66             a[i+1]++;
 67         }
 68     }
 69     //更正位数
 70     while(a[a[0]+1]>0) a[0]++;
 71     return a;
 72 }
 73 //高精度加法
 74 int* jia(int a[],int b[]){
 75     if(a[0]<b[0]) a[0]=b[0];
 76     //加
 77     for(int i=1;i<=a[0];i++){
 78         a[i]+=b[i];
 79     }
 80     //处理进位
 81     for(int i=1;i<=a[0];i++){
 82         if(a[i]>=10){
 83             a[i]%=10;
 84             a[i+1]++;
 85         }
 86     }
 87     //更正位数
 88     while(a[a[0]+1]>0) a[0]++;
 89     return a;
 90
 91 }
 92 //赋值,把ans数组的值全部给dp数组
 93 void give(int ans[],int dp[]){
 94     for(int i=0;i<=ans[0];i++){
 95         dp[i]=ans[i];
 96     }
 97 }
 98 int* f(int n){
 99     if(dp[n][0]!=0) return dp[n];
100     else if(0==n) return dp[0];
101     else if(1==n) return dp[1];
102     else{
103         int tmp_1[Max]={0};
104         int tmp_2[Max]={0};
105         give(f(n-1),tmp_1);
106         give(f(n-2),tmp_2);
107         give(jia(tmp_1,chen(tmp_2,2)),dp[n]);
108         return dp[n];
109     }
110 }
111
112 int main(){
113     dp[0][0]=1,dp[0][1]=1;//前面是位数,后面是数
114     dp[1][0]=1,dp[1][1]=1;
115     int n=100;
116     while(scanf("%d",&n)!=EOF){
117         f(n);
118         print(dp[n]);
119     }
120     return 0;
121 } 
时间: 2024-10-26 00:49:25

递归--练习11--noi9273 PKU2506Tiling的相关文章

Python 第五天 递归,计算器(2)

利用函数编写如下数列: 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 1 def func(arg1,arg2): if arg1 == 0: pass arg3 = arg1 + arg2 if arg3>1000; return arg3#他的调用者应该是他的前一次func函数, return f

11 函数和函数式编程 - 《Python 核心编程》

?? 什么是函数 ?? 调用函数 ?? 创建函数 ?? 传入函数 ?? 形参 ?? 变长参数 ?? 函数式编程 ?? 变量的作用域 ?? 递归 ?? 生成器 11.1 什么是函数? 函数是对程序逻辑进行结构化或过程化的一种编程方法. 函数可以以不同的形式出现. declaration/definition          def foo(): print 'bar' function object/reference    foo function call/invocation      

python开发函数进阶:递归函数

一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #:基础版本 5 def story(): 6 print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?") 7 while True: 8 story() 9 10 #:递归版本 11 def story

三种快速排序以及快速排序的优化

一.  快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.  快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大: 3) 递归地对两个序列进行快速排序,直到

UVa 10599【lis dp,记忆化搜索】

UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号.格子编号是从 左上角第一个开始,一行一行的按自然数顺序编.起始行列是第一行第一列.所以例如一个格子的行列号为(ro,co),那么它的编号为bh=(ro-1)*column+co,其中column指这个格子有多少列.(我觉得原题里面有个错误,题目叙述倒数第二行应该是41(6,6)不是41(6,7)).

SQL Server2012 T-SQL基础教程--读书笔记

SQL Server2012 T-SQL基础教程--读书笔记 SqlServer Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的完整性 1.3.1 创建表 1.3.2 定义数据的完整性 1. 主键约束 2. 唯一约束 3. 外键束约 4. CHECK约束 5. 默认约束 Chapter 02 单表查询 2.1 SELECT 语句元素 2.1.7 TOP和OFFSET-FETCH 1. TOP筛选 2. OFFSET-FETCH 2.1.8 开窗函数速览 2.2 谓词

hdu 1754:I Hate It(线段树,入门题,RMQ问题)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 33726    Accepted Submission(s): 13266 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求

Java遍历文件夹下的所以文件

利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重命名操作 1 package com.zhang.test; 2 3 import java.io.File; 4 5 public class getfilepath { 6 7 public static void main(String[] args) { 8 getDirectory(new

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京