Total Submission(s): 349 Accepted Submission(s): 225
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.
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.
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
3 2 4HintHint: 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.
解题思路:明显的DFS题目,只不过,注意顺序,做完题目i后,可以按照第i行的数据选择下一个要做的题目,数据量不大,不用剪枝,直深搜就好了。
#include<stdio.h> #include<cstring> using namespace std; int map[15][15]; int flag[16]; //做题情况记录,做过的题目就不用再做了 int sum,n; void dfs(int max2,int sum1,int j) //用于验证的值,当前解题数量,当前行 { //printf("dfs\n"); for(int i=0;i<n;i++) { if(!flag[i]&&map[j][i]>=max2) //不大于的意思就是,小于或等于//做过的题目就不用再做了 { flag[i]=1; sum=sum>sum1+1?sum:sum1+1; //printf("max2=%d map[i][j]=%d sum1+1=%d j=%d f[%d]=1\n",max2,map[j][i],sum1+1,j,i); dfs(map[j][i],sum1+1,i); //做了第i题了,后面按照第i行的数据选题 flag[i]=0; } } } int main() { int i,j; int t; while(scanf("%d",&n)!=EOF) { sum=0; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&map[i][j]); memset(flag,0,sizeof(flag)); flag[0]=1; dfs(0,1,0); printf("%d\n",sum); } return 0; }