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.
BFS
//hdu2614 Beat BFS #include <cstdio> #include <cstring> #include <queue> #include <map> #include <iostream> using namespace std; const int maxn = 15 + 10; struct node { //pos是当前位置,maxx是到目前为止最大的Tij值,cnt计数 int pos, maxx, cnt; //m用来标记是否走过,m[i] > 0走过,m[i] == 0没有 //每个节点相当于一个状态,都要有自己的标记情况 map<int, int> m; node() {} node(int pos, int maxx, int cnt) : pos(pos), maxx(maxx), cnt(cnt) {} }; int n, mapp[maxn][maxn], ans; void bfs() { queue<node> Q; node ns = node(0, 0, 1); ns.m[0]++; Q.push(ns); while (!Q.empty()) { node tn = Q.front(); Q.pop(); ans = max(ans, tn.cnt); int p = tn.pos, maxx = tn.maxx; for (int i = 0; i < n; i++) { //自己不能到自己,不重复走,不走更小的 if (i != p && tn.m[i] == 0 && mapp[p][i] >= maxx) { node in = tn; in.pos = i; in.cnt++; in.maxx = mapp[p][i]; in.m[i]++; Q.push(in); } } } } int main() { while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &mapp[i][j]); } } ans = -1; bfs(); printf("%d\n", ans); } return 0; }
DFS
//hdu2614 Beat DFS #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 15 + 10; int mapp[maxn][maxn], ans, n; bool vis[maxn]; //解到第dep个题,此时最大的时间值为maxx,cnt为已经将dep计算在内的题目数量 void dfs(int dep, int maxx, int cnt) { ans = max(ans, cnt); for (int i = 0; i < n; i++) { //去重,不走自己,不走更小的 if (!vis[i] && dep != i && mapp[dep][i] >= maxx) { vis[i] = true; dfs(i, mapp[dep][i], cnt + 1); vis[i] = false; } } } int main() { while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &mapp[i][j]); } } ans = -1; memset(vis, false, sizeof(vis)); vis[0] = true; dfs(0, 0, 1); vis[0] = false; printf("%d\n", ans); } return 0; }