P1028 [NOIP2001 普及组] 数的计算

解题思路:

一开始用了暴力递归,爆了 找规律+简单dp思想(递推)

  • 先暴力求出前十的答案,可以发现f[i]==f[i+1]
  • 当i为偶数怎么求呢?以8为例:
  • 8
  • 18
  • 28 128
  • 38 138
  • 48 148 248 1248
  • 可以发现前四行把8->7,就是7的情况。最后一行把把删掉就是4的情况

解题代码1(暴力):

#include<bits/stdc++.h>
using namespace std;
void deal(int n,int &cnt){
	if(n&1) n--;
	n/=2;
	cnt+=n;
	for(int i=n;i>0;i--) deal(i,cnt);
}
int main(){
	int n;
	while(cin>>n){
		int cnt=0;
		deal(n,cnt);
		cout<<cnt+1<<endl;
	}
	return 0;
} 

解题代码2:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int f[1001]={0};
	f[0]=1;f[2]=2;f[1]=1;
	for(int i=3;i<=n;i++){
		if(i&1) f[i]=f[i-1];
		else f[i]=f[i-1]+f[i/2]; 
	}
	cout<<f[n]<<endl;
	return 0;
}