HDU 1041[Computer Transformation] 递推 高精度

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

题目大意:初始数字1。规则1变成01,0变成10。问经过N次完整变换后,有多少连续零对。

关键思想:考虑零对的直接来源只有"10",而"10"的直接来源只有”1“或者”00“。于是可以得到以下几种递推式

1. dp[i]=pow(2,i-3)+dp[i-2];当前层多少1,下一层就多少10,下下层就多少00;当前层多少00,下一层就多少10,,下下层就多少00
2. dp[i]=dp[i-1]+2*dp[i-2];

通项公式为:((2^n+1)+(-1)^n)/3

代码如下:

#include <iostream>
#include <cmath>
using namespace std;
int dp[1010][1010];
//通项公式:div(add(Pow("2",n-1),"1"),3)
//1.dp[i]=pow(2,i-3)+dp[i-2];
//2.dp[i]=dp[i-1]+2*dp[i-2]
//代码中所用为递推式2
void solve(){
	int c=0;
	for(int i=4;i<1002;i++){
		for(int j=1;j<1010;j++){
			dp[i][j]=2*dp[i-2][j]+dp[i-1][j]+c;
			c=dp[i][j]/10;
			dp[i][j]%=10;
			if(dp[i][j]==0&&c==0&&j>=dp[i-1][0]){
				dp[i][0]=j-1;
				break;
			}//保存大数长度
		}
	}
	return;
}
void print(int n){
	for(int i=dp[n][0];i>=1;i--){
		printf("%d",dp[n][i]);
	}
	cout<<endl;
}

int main(){
	int n;
	dp[0][1]=0,dp[0][0]=1;
	dp[1][1]=0,dp[1][0]=1;
	dp[2][1]=1,dp[2][0]=1;
	dp[3][1]=1,dp[3][0]=1;
	solve();
	while(cin>>n){
		print(n);
	}
	return 0;
}

  

时间: 2024-12-21 17:45:11

HDU 1041[Computer Transformation] 递推 高精度的相关文章

HDU 1041 Computer Transformation 数学DP题解

本题假设编程是使用DP思想直接打表就能够了. 假设是找规律就须要数学思维了. 规律就是看这些连续的0是从哪里来的. 我找到的规律是:1经过两次裂变之后就会产生一个00: 00经过两次裂变之后也会产生新的00:故此须要记录好1和00出现的次数就能够递推出后面的00出现的数据了. 公式就是tbl00[i] = tbl00[i-2] + tbl1[i-2]; 当中tbl00是记录00出现的次数,tbl1是出现1出现的次数. 公式事实上是能够化简的,只是我懒得化简了.这种公式非常清楚了. 只是因为这种数

HDU 1041 Computer Transformation(找规律加大数乘)

主要还是找规律,然后大数相乘 #include<stdio.h> #include<string.h> #include<math.h> #include<time.h> #include<map> #include<iostream> #include<ctype.h> #include<string> #include<algorithm> #include<stdlib.h> #i

hdu 1723 Distribute Message 递推

#include <cstdio> #include <cstring> using namespace std; int dp[50]; int main() { int n,m; while(1) { scanf("%d%d",&n,&m); if(n==0&&m==0) break; int i,j; memset(dp,0,sizeof(dp)); dp[1]=1; for(i=2;i<=n;i++) for(j=i

hdu 1396 Counting Triangles (递推)

Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2012    Accepted Submission(s): 966 Problem Description Given an equilateral triangle with n the length of its side, program to

递推 + 高精度 --- Tiling

Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7264   Accepted: 3528 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,

递推+高精度+找规律 UVA 10254 The Priest Mathematician

题目传送门 1 /* 2 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 3 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子,2 ^ (n - k) - 1 4 所以f[n] = min (f[k] * 2 + g[n-k]),n<=10000,所要要用高精度,另外打表能看出规律 5 */ 6 /************************************************ 7 * Auth

POJ 2506 Tiling (递推+高精度)

[题目链接]click here~~ [题目大意] In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? Here is a sample tiling of a 2x17 rectangle. [解题思路]: (1)一个2*2的格子有三种填充方法: 两个横着放, 两个竖着放, 放一个2*2 (2)得出递推公式F[i]=F[i-1]+F[i-2]*2 然后就是套高精度模板了 代码; /* Author:HRW 递推+

BZOJ 1089 严格n元树 (递推+高精度)

题解:用a[i]表<=i时有几种树满足度数要求,那么这样就可以递归了,a[i]=a[i-1]^n+1.n个节点每个有a[i-1]种情况,那么将其相乘,最后加上1,因为深度为0也算一种.那么答案就是a[n]-a[n-1].然后就是高精度的问题了,发现很久没有现码高精度没手感了,连高进度加法进位都出了些问题,需要特别注意. #include <cstdio> #include <cstring> #include <algorithm> using namespace

hdu 2571 命运(递推,请小心)

题目 //不能广搜,会超内存//可以用dp思想模拟//map 后来保存的是 保存由前面推来的最大的幸运总值的点//下标从1开始,不然倍数会有问题 //AC 代码: AC代码 //不能广搜,会超内存 //可以用dp思想模拟 //map 后来保存的是 保存由前面推来的最大的幸运总值的点 //下标从1开始,不然倍数会有问题 //又错了那么多次... //重写... //求过!!! #include<stdio.h> #include<string.h> #include<algor