算法训练1题解

这题涉及到新的算法,好好学习!
这是一道经典的二分匹配题+匈牙利算法【 趣写算法系列——匈牙利算法】,匹配过程有递归和回溯。

#include <stdio.h>
#include <string.h>

using namespace std;

#define maxsize 501

int line[maxsize][maxsize];
int used[maxsize];
int boy[maxsize];
int M,N;

int find(int x);

int main()
{
    int K;
    int i,x,y;
    int num;
    while(scanf("%d",&K),K)
    {
        memset(boy,0,sizeof(boy));
        memset(line,0,sizeof(line));

        scanf("%d%d",&M,&N);
        for(i=1; i<=K; i++)
        {
            scanf("%d%d",&x,&y);
            line[x][y]=1;
        }
        num=0;
        for(i=1; i<=M; i++) //依次扫描每个女生
        {
            memset(used,0,sizeof(used));

            if(find(i))
                num++;
        }
        printf("%d\n",num);
    }

    return 0;
}
/*匈牙利算法*/
int find(int x)
{
    int i;
    for(i=1; i<=N; i++) //依次扫描每个男生
    {
        if(line[x][i]==1&&used[i]==0) //如果女生x愿意和男生i一起坐,
        {							
            used[i]=1;//男生i 被分配			
            if(boy[i]==0||find(boy[i]))//男生i还未被分配或者男生i有其他的中意者
            {
                boy[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
题意:升级版汉诺塔,在经典的汉诺塔问题的基础上添加新的规则:每次移动圆盘只能移到相邻的铁棒上;
依然采用递推的方法:设最左边开始有n个圆盘,那么最后完成之前一定会经历以下情景,前n-1个盘已经位于右边相邻的铁棒上,设该过程需要耗用x步,然后再重复该过程,将n-1个圆盘移动最右边的铁棒上,这两步实际上就是只有n-1个圆盘的汉诺塔问题,令总的步数为f(n-1);然后将最底下的圆盘移到第二个铁棒,共1步,再将最右边的圆盘全部移到最左边,共f(n-1)步,再将中间的圆盘移到最右边,共1步,再将最左边的圆盘移到最右边,共f(n-1)步,完成n个圆盘的移动任务。
所以递推公式为:f(n)=3*f(n-1)+2;

#include <stdio.h>
using namespace std;
int main()
{
	int i;
	long long int f[36];
	f[1]=2;
	f[2]=8;
	f[3]=26;
	for(i=4;i<=35;i++)
		f[i]=3*f[i-1]+2;

	while(scanf("%d",&i)!=EOF)
		printf("%I64d\n",f[i]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值