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.
题意:有n道题,a[i][j]表示做完i题后做j题的难度,这个人从第0题开始做,每次做不比上次题目简单的题,问他最多做多少题?
理解题意半天,解题还是比较顺利,解释在代码中
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; #define N 20 int a[N][N],n; int ans,vis[N]; void dfs(int le,int num,int s) //le表示刚做的题,例如le=0,那么现在在第0行选择做的下一题,s是刚做题的难度 { int i; if(num>ans) ans=num; //num是已经做的题 for(i=0;i<n;i++) { if(vis[i]||a[le][i]<s) continue;//这个题做过,或者现在做i题难度没有s(前一题的分)高 vis[i]=1; //假设做i题 dfs(i,num+1,a[le][i]); vis[i]=0; //取消假设 } } int main() { int i,j; while(~scanf("%d",&n)) { for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); memset(vis,0,sizeof(vis)); vis[0]=1; //题目说先做第0题 ans=0; dfs(0,1,0); printf("%d\n",ans); } return 0; }
HDU 2614 Beat (dfs),布布扣,bubuko.com
原文:http://blog.csdn.net/u014737310/article/details/38586953