Beat
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1286 Accepted Submission(s): 751
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.
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;
}
680



被折叠的 条评论
为什么被折叠?



