zjut1624序列问题

这是去年校赛得题目,作为当时的fresh man
我们水水地硬是人工枚举把答案暴力出来了,今天回过头来写,感觉大不一样了!
一道简单的DFS
#include<iostream>
using namespace std;
int n,num;
void dfs(int k,int tmp,int last,int c)//k表示接下来要在k与k+1中间进行处理,tmp当前获得值,last表示最后一次加上或减去的数,c表示最后一次进行的运算 ,1表示‘+’,0表示‘-’
 {          
         if(n==k){if(tmp==0)num++;return;}
	dfs(k+1,tmp+k+1,k+1,1);
	dfs(k+1,tmp-k-1,k+1,0);
	if(c==1)dfs(k+1,(tmp-last)+(last*10+k+1),last*10+k+1,1);
	if(c==0) dfs(k+1,(tmp+last)-(last*10+k+1),last*10+k+1,0);
}
int main()
{
	while(cin>>n)
	{
         num=0;
		 dfs(1,1,1,1);
		 cout<<num<<endl;

	}

	
}
posted on 2011-04-01 13:10  4.5.6  阅读(235)  评论(0编辑  收藏  举报