问题链接:HDU2614 Beat。
本题可以使用深度优先搜索求解。
根据提示,总是先做第0道题。然后,需要保证题越做越难。
其他解释都写在注释中了。
/* 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;
}