您的位置:首页 > 其它

HDU 2614 Beat(dfs)

2015-09-08 08:37 330 查看
Description

有n个问题,map[i][j]表示解决完i问题后去解决j问题的用时,每次解决一个问题的时间必须是非严格递增的,现在从第0个问题开始解决,第0个问题用时为0,问最多可以解决多少问题

Input

多组输入,每组用例第一行为一整数n表示问题个数,之后一个n*n矩阵map,map[i][j]表示解决完i问题后去解决j问题的用时,以文件尾结束输入

Output

对于每组用例,输出能够解决的最多问题数

Sample Input

3

0 0 0

1 0 1

1 0 0

3

0 2 2

1 0 1

1 1 0

5

0 1 2 3 1

0 0 2 3 1

0 0 0 3 1

0 0 0 0 2

0 0 0 0 0

Sample Output

3

2

4

Solution

dfs,枚举搜索起点,每次往下深搜的条件是满足用时非严格递增,不断更新最大搜索深度即可

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int map[20][20];
bool vis[20];
int n,ans;
void dfs(int now,int len,int time)
{
ans=max(ans,len);//不断更新最大搜索深度
for(int i=1;i<n;i++)//枚举下一道题
if(!vis[i]&&map[now][i]>=time)//满足继续做的条件
{
vis[i]=true;//标记这个问题表示已经解决
dfs(i,len+1,map[now][i]);//深搜
vis[i]=false;//回溯
}
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
memset(vis,false,sizeof(vis));//初始化
vis[0]=true;//从第0个问题开始解决
ans=0;//最大解题数
for(int i=1;i<n;i++)//枚举搜索起点
{
vis[i]=true;//标记这个问题表示已经解决
dfs(i,2,map[0][i]);//深搜
vis[i]=false;//回溯
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: