天天看點

HDU 2614 Beat (DFS)

Beat

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1346    Accepted Submission(s): 793

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

​​奮鬥的年代​​

Recommend

yifenfei   |   We have carefully selected several similar problems for

you:  ​​1426​​​ ​​1258​​​ ​​2616​​​ ​​1045​​​ ​​1035​​ 

題解:有一個人刷題,這個人準備刷n道題,但他刷的下一道題不會比前一道刷的題要簡單,至少>=的難度。Orz.....先膜一下。。。

注意:

題目中的Tij就是第i行第j列代表着,刷完 i 号題目後刷 j 題目所花費的時間,如果刷 i 題目花費了2分鐘,刷完 i 後刷 j 花費時間小于2分

鐘,這個人不會去刷這道題,他隻刷花費時間大于等于2分鐘的題目。Orz。。。

        DFS。。。。

AC代碼:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
int vis[21];
int map[20][20];
int sum; int n;
void dfs(int k, int num,int time)
{
  for(int i=0;i<n;i++)
  {
    if(vis[i]==0 &&map[k][i]>=time)
    {
      vis[i]=1;
      dfs(i,num+1,map[k][i]);
      vis[i]=0;
    }
    
  }
  sum=max(sum,num);
}
int main()
{
  ios::sync_with_stdio(false);
  while(cin>>n&&n)
  {
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
      {
        cin>>map[i][j];
      }
    }
    memset(vis,0,sizeof(vis));
    sum=0;
    vis[0]=1;
    dfs(0,1,0);
    cout<<sum<<"\n";
  }
  return 0;
}