杭电acm 1005题 有没递归的方法,顺便把正确的方法也贴出来的吧

[复制链接]
查看11 | 回复3 | 2011-5-27 12:47:24 | 显示全部楼层 |阅读模式
回复

使用道具 举报

千问 | 2011-5-27 12:47:24 | 显示全部楼层
#includeiostream
#includecstring
usingnamespacestd;

inthappen[7][7];//用来计算出现的位置

intmain()
{
intA,B,n;
intf1,f2,fn;
while(cinABn)
{
if(A==0
memset(happen,0,sizeof(happen));//初始化
f1=1;f2=1;//初始化
if(n==1||n==2)cout1endl;//特殊处理
else
{
for(inti=3;i=n;i)
{
if(happen[f1][f2]==0)//如果f1和f2以前没出现过
{
happen[f1][f2]=i;//记录第一次出现f1和f2的位置
fn=(A*f2B*f1)%7;//计算下一个数
//coutfn\"\";
f1=f2;//退一个
f2=fn;//退一个
}
else//如果f1和f2以前已经出现过
{
n=n-i;//算一下目标与现在的距离
n%=(i-happen[f1][f2]);//循环距离是i-之前记录的记录,把n缩短到1个循环距离以内,获得n的循环位置
n=i;//加上现在的i,获得下一个和n具有相同循环位置的下标
fn=(A*f2B*f1)%7;//计算下一个
f1=f2;//退一个
f2=fn;//退一个
}
}
coutfnendl;
}
}
}
回复

使用道具 举报

千问 | 2011-5-27 12:47:24 | 显示全部楼层
递归和递推有什么区别的么?呵呵,你ACM的队员么?我刚刚接触这个的,不久的哈,是否可以加你的呀?
回复

使用道具 举报

千问 | 2011-5-27 12:47:24 | 显示全部楼层
递归会有许多重复计算。你想递归也可以。但要用记忆化,就是用一个数组来存下结果,每次计算的时候看看以前有没有算过,没算过接着算,算过了直接返回结果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行