Skip to content

Commit 15c9678

Browse files
committed
google code jam round1a
1 parent ce7db4a commit 15c9678

File tree

3 files changed

+304
-0
lines changed

3 files changed

+304
-0
lines changed

baekjoon/2098.cpp

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <iostream>
2+
#include <algorithm>
3+
#include <vector>
4+
5+
using namespace std;
6+
7+
int graph[20][20], N;
8+
int cache[20][1 << 17];
9+
10+
int dp(int start, int here, int left)
11+
{
12+
int& ret = cache[here][left];
13+
14+
if(ret != -1)
15+
return ret;
16+
if(left == 0)
17+
return ret = 0;
18+
19+
for(int i = 0; i < N; i++)
20+
{
21+
int check = left & (1 << i);
22+
23+
if(check && graph[here][i] != 0)
24+
{
25+
if(i == start && left - (1 << start) != 0)
26+
continue;
27+
28+
int result = dp(start, i, left - (1 << i)) + graph[here][i];
29+
if(result == -1)
30+
continue;
31+
32+
ret = (ret == -1 ? result : min(ret, result));
33+
}
34+
}
35+
36+
return ret;
37+
}
38+
39+
int main()
40+
{
41+
cin >> N;
42+
for(int i = 0; i < N; i++)
43+
{
44+
for(int j = 0; j < (1 << N); j++)
45+
cache[i][j] = -1;
46+
47+
for(int j = 0; j < N; j++)
48+
{
49+
cin >> graph[i][j];
50+
}
51+
}
52+
53+
54+
int ans = 1e9;
55+
for(int i = 0; i < N; i++)
56+
{
57+
ans = min(ans, dp(i, i, (1 << N) - 1));
58+
}
59+
60+
for(int i = 0; i < N; i++)
61+
{
62+
for(int j = 0; j < (1 << N); j++)
63+
cout << i << ' ' << j << ' ' << cache[i][j] << '\n';
64+
}
65+
66+
cout << ans << '\n';
67+
}

google code jam/2019/Round 1A/A.cpp

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#include <iostream>
2+
3+
using namespace std;
4+
5+
bool visited[402][402], f;
6+
int T, r, c;
7+
8+
bool dfs(int x, int y)
9+
{
10+
bool ret = true;
11+
12+
for(int i = 0; ret && i < r; i++)
13+
for(int j = 0; ret && j < c; j++)
14+
{
15+
if(!visited[i][j])
16+
ret = false;
17+
}
18+
19+
for(int i = 0; !ret && i < r; i++)
20+
for(int j = 0; !ret && j < c; j++)
21+
{
22+
if(!visited[i][j])
23+
{
24+
if(i != x && j != y && (x + y != i + j) && (y - x != j - i))
25+
{
26+
visited[i][j] = true;
27+
ret = dfs(i, j);
28+
visited[i][j] = false;
29+
}
30+
}
31+
}
32+
33+
if(ret)
34+
{
35+
if(f)
36+
{
37+
printf("POSSIBLE\n");
38+
f = false;
39+
}
40+
printf("%d %d\n", x + 1, y + 1);
41+
}
42+
return ret;
43+
}
44+
45+
int main()
46+
{
47+
int t = 1;
48+
for(scanf("%d", &T); t <= T; t++)
49+
{
50+
bool ans = false;
51+
f = true;
52+
printf("Case #%d: ", t);
53+
scanf("%d %d", &r, &c);
54+
55+
for(int i = 0; !ans && i < r; i++)
56+
for(int j = 0; !ans && j < c; j++)
57+
{
58+
visited[i][j] = true;
59+
ans = dfs(i, j);
60+
visited[i][j] = false;
61+
}
62+
63+
if(!ans)
64+
printf("IMPOSSIBLE\n");
65+
}
66+
}

google code jam/2019/Round 1A/C.cpp

+171
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
#include <iostream>
2+
#include <vector>
3+
#include <algorithm>
4+
#include <queue>
5+
#include <string>
6+
#include <map>
7+
#include <set>
8+
9+
#define MAXSIZE 2010
10+
#define MAX 100000000
11+
12+
using namespace std;
13+
14+
struct FlowGraph {
15+
struct Edge {
16+
int idx;
17+
int start, end, capacity;
18+
};
19+
20+
vector<Edge> E;
21+
vector<int> V[MAXSIZE];
22+
int source, sink, level[MAXSIZE], start[MAXSIZE];
23+
24+
void clear()
25+
{
26+
E.clear();
27+
for(int i = 0; i < MAXSIZE; i++)
28+
{
29+
V[i].clear();
30+
start[i] = 0;
31+
}
32+
}
33+
34+
void setEdge(int u, int v, int c) {
35+
int n = E.size();
36+
37+
E.push_back({n, u, v, c});
38+
E.push_back({n + 1, v, u, 0});
39+
40+
V[u].push_back(n);
41+
V[v].push_back(n + 1);
42+
}
43+
44+
void levelGraph() {
45+
queue<int> q;
46+
for(int i = 0; i < MAXSIZE; i++) level[i] = -1;
47+
48+
level[source] = 0;
49+
q.push(source);
50+
51+
while(!q.empty()) {
52+
int here = q.front(); q.pop();
53+
54+
for(auto edge : V[here]) {
55+
int next = E[edge].end;
56+
if(level[next] == -1 && E[edge].capacity) {
57+
level[next] = level[here] + 1;
58+
q.push(next);
59+
}
60+
}
61+
}
62+
}
63+
64+
long long dfs(int u, int minFlow = MAX) {
65+
if(u == sink) return minFlow;
66+
67+
for(; start[u] < V[u].size(); start[u]++) {
68+
auto edge = E[V[u][start[u]]];
69+
int next = edge.end;
70+
71+
if(level[next] == level[u] + 1 && edge.capacity) {
72+
long long f = dfs(next, min(minFlow, edge.capacity));
73+
if(f) {
74+
E[edge.idx].capacity -= f;
75+
E[edge.idx ^ 1].capacity += f;
76+
return f;
77+
}
78+
}
79+
}
80+
81+
return 0;
82+
}
83+
84+
long long maxflow() {
85+
long long ret = 0;
86+
while(1) {
87+
levelGraph();
88+
if(level[sink] == -1) break;
89+
for(int i = 0; i < MAXSIZE; i++) start[i] = 0;
90+
while(1) {
91+
long long flow = dfs(source);
92+
if(flow == 0) break;
93+
ret += flow;
94+
}
95+
}
96+
97+
return ret;
98+
}
99+
} G;
100+
101+
map<string, set<int> > m;
102+
int n;
103+
104+
void longestSuffix(string& s1, string& s2, string& ret)
105+
{
106+
ret = "";
107+
int start1 = s1.size() - 1, start2 = s2.size() - 1;
108+
for(; start1 >= 0 && start2 >= 0 && s1[start1] == s2[start2]; start1--, start2--)
109+
{
110+
ret += s1[start1];
111+
}
112+
113+
reverse(ret.begin(), ret.end());
114+
}
115+
116+
int main()
117+
{
118+
ios::sync_with_stdio(false);
119+
cin.tie(NULL);
120+
121+
int t = 1, T;
122+
for(cin >> T; t <= T; t++)
123+
{
124+
int idx;
125+
126+
cout << "Case #" << t << ": ";
127+
m.clear();
128+
G.clear();
129+
130+
cin >> n;
131+
132+
vector<string> ss = vector<string>(n + 1);
133+
G.source = 0;
134+
135+
for(int i = 0; i < n; i++)
136+
{
137+
cin >> ss[i + 1];
138+
G.setEdge(G.source, i + 1, 1);
139+
}
140+
141+
string s;
142+
for(int i = 1; i <= n; i++)
143+
{
144+
for(int j = i + 1; j <= n; j++)
145+
{
146+
longestSuffix(ss[i], ss[j], s);
147+
if(s != "")
148+
{
149+
m[s].insert(i);
150+
m[s].insert(j);
151+
}
152+
}
153+
}
154+
155+
G.sink = n + m.size() + 1;
156+
idx = n + 1;
157+
158+
for(auto p : m)
159+
{
160+
for(int ele : p.second)
161+
{
162+
G.setEdge(ele, idx, 1);
163+
}
164+
165+
G.setEdge(idx, G.sink, 2);
166+
idx++;
167+
}
168+
169+
cout << G.maxflow() << '\n';
170+
}
171+
}

0 commit comments

Comments
 (0)