HDU 2614 BEAT(DFS)

2614原题链接

Problem Description

Zty is a man that always full of enthusiasm. He wants to solve every kind of difficulty ACM problem in the world. And he has a habit that he does not like to solve
a problem that is easy than problem he had solved. Now yifenfei give him n difficulty problems, and tell him their relative time to solve it after solving the other one.
You should help zty to find a order of solving problems to solve more difficulty problem.
You may sure zty first solve the problem 0 by costing 0 minute. Zty always choose cost more or equal time’s problem to solve.

Input

The input contains multiple test cases.
Each test case include, first one integer n ( 2< n < 15).express the number of problem.
Than n lines, each line include n integer Tij ( 0<=Tij<10), the i’s row and j’s col integer Tij express after solving the problem i, will cost Tij minute to solve the problem j.

Output

For each test case output the maximum number of problem zty can solved.

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

这个题的题意不太好读懂
【题目大意:】一个人有一个习惯,不喜欢解决比他已解决的问题还要简单的问题,现在把问题的难易程度用矩阵表示。规定这个人必须从第0个问题开始解决,且第0个问题只需要0分钟解决。矩阵的元素Tij表示第i个问题解决完后,解决第j个问题需要花费的时间,问题花费的时间越长越难。最后,你要找出一种合理的解决问题的顺序,能使该人解决问题的个数最多。

读懂题意之后,这个题其实就很简单了。直接用dfs搜索,对于每次选问题的时候,最多都有n种选法,所以肯定跟全排列一样有一个1–n的for循环,至于该问题能不能选,那就得看一些判断条件了(比如这个问题是否被解决过等)

AC代码:

#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 20;
int t[maxn][maxn];
int tag[maxn];
int n;
int max_res;

void dfs(int k, int question, int cost)		//k代表解决的问题个数, question代表当前解决的问题编号 
{
	if(k > max_res)
		max_res = k;
	if(k == n)
		return;
	for(int i = 0;i < n;i++)
	{
		if(tag[i] != 1 && t[question][i] >= cost)
		{
			tag[i] = 1;
			dfs(k + 1, i, t[question][i]);
			tag[i] = 0;
		}
	}
}

int main()
{
	while(scanf("%d", &n) != EOF)
	{
		memset(tag, 0, sizeof(0));
		max_res = 0;
		for(int i = 0;i < n;i++)
		{
			for(int j = 0;j < n;j++)
			{
				cin >> t[i][j];
			}
		}
		tag[0] = 1;
		dfs(1, 0, 0);
		cout << max_res << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值