Beat
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1870 Accepted Submission(s): 1117
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
Hint
Hint: sample one, as we know zty always solve problem 0 by costing 0 minute. So after solving problem 0, he can choose problem 1 and problem 2, because T01 >=0 and T02>=0. But if zty chooses to solve problem 1, he can not solve problem 2, because T12 < T01. So zty can choose solve the problem 2 second, than solve the problem 1.
Author
yifenfei
Source
问题链接:HDU2614 Beat。
问题简述:(略)
问题分析:这个问题可以用深度优先搜索解决。根据提示,总是先做第0道题。然后,需要保证题越做越难。
程序说明:参见程序注释。
AC的C语言程序如下:
/* HDU2614 Beat */
#include <stdio.h>
#include <memory.h>
#define MAX(a, b) (((a) > (b))?(a):(b))
#define MAXN 15
int time[MAXN+1][MAXN+1]; // time[i][j]:做完第i道题后,做第j道题需要的时间
int visit[MAXN+1];
int n;
int sum; // 已经做了多少题
// p:第p个问题,正在解决
// lasttime:上次做题时间
// count:已经做了多少题
void dfs(int p, int lasttime, int count)
{
int i;
sum = MAX(sum, count);
if(sum == n)
return;
for(i=1; i<n; i++) {
if(!visit[i] && time[p][i] >= lasttime) {
visit[i] = 1;
dfs(i, time[p][i], count+1);
visit[i] = 0;
}
}
}
int main(void)
{
int i, j;
while(scanf("%d", &n) != EOF) {
// 读入矩阵
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d", &time[i][j]);
// 清零
memset(visit, 0, sizeof(visit));
// 深度优先搜索
sum = 0;
visit[0] = 1;
dfs(0, 0, 1);
// 输出结果
printf("%d\n", sum);
}
return 0;
}