码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1041[Computer Transformation] 递推 高精度

时间:2017-02-19 13:56:49      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:amp   main   namespace   class   高精度   cout   php   连续   clu   

题目链接: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;
}

  

HDU 1041[Computer Transformation] 递推 高精度

标签:amp   main   namespace   class   高精度   cout   php   连续   clu   

原文地址:http://www.cnblogs.com/G-M-WuJieMatrix/p/6415456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!