HDU 4678 Mine

对于每个空白区域,求SG值。

最后异或起来等于0,先手必败。

 #pragma comment(linker,"/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#define MAXN 1010
#define oo 1234567890
int arr[MAXN][MAXN];
bool vis[MAXN][MAXN];
int n, m;
int dg, bk;
int sg[MAXN * MAXN][];
int go[][] = { { , }, { -, }, { , }, { , - }, { -, - },
{ -, }, { , - }, { , } };
bool isIn(int x, int y) {
return x >= && x < n && y >= && y < m;
}
int SG(int digit, int blank) {
if (sg[digit][blank] == -) {
int x, y;
x = y = -;
if (blank) {
x = SG(, );
}
if (digit) {
y = SG(digit - , blank);
}
for (int i = ;; i++) {
if (i != x && i != y) {
sg[digit][blank] = i;
break;
}
}
}
return sg[digit][blank];
}
void dfs(int x, int y) {
vis[x][y] = true;
if (arr[x][y] > ) {
dg++;
} else if (arr[x][y] == ) {
bk = ;
int nx, ny;
for (int i = ; i < ; i++) {
nx = x + go[i][];
ny = y + go[i][];
if (isIn(nx, ny) && !vis[nx][ny]) {
dfs(nx, ny);
}
}
}
}
int main() {
int T;
int ca = ;
int x, y;
int i, j, k;
int res;
memset(sg, -, sizeof(sg));
sg[][] = ;
scanf("%d", &T);
while (T--) {
scanf("%d%d%d", &n, &m, &k);
memset(arr, , sizeof(arr));
while (k--) {
scanf("%d%d", &x, &y);
arr[x][y] = -oo;
}
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
if (arr[i][j] < ) {
for (k = ; k < ; k++) {
x = i + go[k][];
y = j + go[k][];
if (isIn(x, y)) {
arr[x][y]++;
}
}
}
}
}
res = ;
memset(vis, false, sizeof(vis));
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
if (!vis[i][j] && arr[i][j] == ) {
dg = bk = ;
dfs(i, j);
res ^= SG(dg, bk);
}
}
}
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
if (!vis[i][j]) {
dg = bk = ;
dfs(i, j);
res ^= SG(dg, bk);
}
}
}
if (res) {
printf("Case #%d: Xiemao\n", ca++);
} else {
printf("Case #%d: Fanglaoshi\n", ca++);
}
}
return ;
}

HDU 4679 Terrorist’s destroy

dp[i][0]表示i为根的最长链。

dp[i][1]表示i为根的次长链。

dp[i][2]表示i为根的第三长链。

 #pragma comment(linker,"/STACK:102400000,102400000")
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200010
#define oo 0x7FFFFFFF
using namespace std;
int first[MAXN], next[MAXN], v[MAXN], cost[MAXN], id[MAXN], e;
int dp[MAXN][];
bool vis[MAXN];
int res, idx;
void addEdge(int x, int y, int val, int idx) {
cost[e] = val;
id[e] = idx;
v[e] = y;
next[e] = first[x];
first[x] = e++;
}
void dfs(int x) {
vis[x] = true;
dp[x][] = dp[x][] = dp[x][] = ;
for (int i = first[x]; i != -; i = next[i]) {
int y = v[i];
if (!vis[y]) {
dfs(y);
if (dp[y][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[x][];
dp[x][] = dp[y][] + ;
} else if (dp[y][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[y][] + ;
} else if (dp[y][] + > dp[x][]) {
dp[x][] = dp[y][] + ;
}
}
}
}
void search(int x, int pre) {
int tmp;
vis[x] = true;
if (pre != -) {
if (dp[x][] + == dp[pre][]) {
if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + > dp[x][]) {
dp[x][] = dp[pre][] + ;
}
} else {
if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + >= dp[x][]) {
dp[x][] = dp[x][];
dp[x][] = dp[pre][] + ;
} else if (dp[pre][] + > dp[x][]) {
dp[x][] = dp[pre][] + ;
}
}
}
for (int i = first[x]; i != -; i = next[i]) {
int y = v[i];
if (!vis[y]) {
if (dp[y][] + == dp[x][]) {
tmp = dp[x][] + dp[x][];
} else {
tmp = dp[x][];
if (dp[y][] + == dp[x][]) {
tmp += dp[x][];
} else {
tmp += dp[x][];
}
}
tmp = cost[i] * max(dp[y][] + dp[y][], tmp);
if (tmp < res) {
res = tmp;
idx = id[i];
} else if (tmp == res && idx > id[i]) {
idx = id[i];
}
search(y, x);
}
}
}
int main() {
int T;
int ca = ;
int n;
int i;
int x, y, val;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
e = ;
memset(first, -, sizeof(first));
for (i = ; i < n; i++) {
scanf("%d%d%d", &x, &y, &val);
addEdge(x, y, val, i);
addEdge(y, x, val, i);
}
res = oo;
memset(vis, false, sizeof(vis));
dfs();
memset(vis, false, sizeof(vis));
search(, -);
printf("Case #%d: %d\n", ca++, idx);
}
return ;
}

HDU 4681 String

分别枚举D在A和B中的起点,可以暴力得到最短终点。

枚举任意两个起点与终点,通过dp可以求得两端的LCS。

 #include<cstdio>
#include<cstring>
#include<vector>
#define MAXN 1010
using namespace std;
char a[MAXN], b[MAXN], c[MAXN];
vector<pair<int, int> > p1, p2;
int f[MAXN][MAXN], g[MAXN][MAXN];
void cal(char a[], char c[], vector<pair<int, int> >&p) {
int i, j, k;
int la = strlen(a + );
int lc = strlen(c + );
p.clear();
for (i = ; i <= la; i++) {
k = ;
if (a[i] != c[k]) {
continue;
}
for (j = i; j <= la; j++) {
if (a[j] == c[k]) {
k++;
}
if (k > lc) {
break;
}
}
if (k > lc) {
p.push_back(make_pair(i, j));
}
}
}
int main() {
int T;
int ca = ;
int ans;
int i, j;
int la, lb, lc;
scanf("%d", &T);
while (T--) {
scanf(" %s %s %s", a + , b + , c + );
la = strlen(a + );
lb = strlen(b + );
lc = strlen(c + );
cal(a, c, p1);
cal(b, c, p2);
ans = ;
if (!(p1.empty() || p2.empty())) {
memset(f, , sizeof(f));
memset(g, , sizeof(g));
for (i = ; i <= la; i++) {
for (j = ; j <= lb; j++) {
if (a[i] == b[j]) {
f[i][j] = f[i - ][j - ] + ;
} else {
f[i][j] = max(f[i - ][j], f[i][j - ]);
}
}
}
for (i = la; i > ; i--) {
for (j = lb; j > ; j--) {
if (a[i] == b[j]) {
g[i][j] = g[i + ][j + ] + ;
} else {
g[i][j] = max(g[i + ][j], g[i][j + ]);
}
}
}
for (i = ; i < (int) p1.size(); i++) {
for (j = ; j < (int) p2.size(); j++) {
ans = max(ans,
lc + f[p1[i].first - ][p2[j].first - ]
+ g[p1[i].second + ][p2[j].second + ]);
}
}
}
printf("Case #%d: %d\n", ca++, ans);
}
return ;
}

【 2013 Multi-University Training Contest 8 】的更多相关文章

  1. 【 2013 Multi-University Training Contest 7 】

    HDU 4666 Hyperspace 曼哈顿距离:|x1-x2|+|y1-y2|. 最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案. #include<cstdio ...

  2. 【 2013 Multi-University Training Contest 6 】

    HDU 4655 Cut Pieces 假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an.但是答案显然不会那么多. 对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a ...

  3. 【 2013 Multi-University Training Contest 5 】

    HDU 4647 Another Graph Game 如果没有边的作用,显然轮流拿当前的最大值即可. 加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值:如果分别被两 ...

  4. 【 2013 Multi-University Training Contest 4 】

    HDU 4632 Palindrome subsequence dp[x][y]表示区间[x,y]构成回文串的方案数. 若str[x]==str[y],dp[x][y]=dp[x+1][y]+dp[x ...

  5. 【 2013 Multi-University Training Contest 3 】

    HDU 4622 Reincarnation 枚举字符串的起点,构造后缀自动机,每次插入一个字符,就能统计得到当前不同字串的个数,预处理出所有的询问. #include<cstdio> # ...

  6. 【 2013 Multi-University Training Contest 2 】

    HDU 4611 Balls Rearrangement 令lcm=LCM(a,b),gcd=GCD(a,b).cal(n,a,b)表示sum(abs(i%a-i%b)),0<=i<n. ...

  7. 【 2013 Multi-University Training Contest 1 】

    HDU 4602 Partition f[i]表示和为i的方案数.已知f[i]=2i-1. dp[i]表示和为i,k有多少个.那么dp[i]=dp[1]+dp[2]+...+dp[i-1]+f[i-k ...

  8. 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump

    多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...

  9. 【2018 Multi-University Training Contest 5】

    01: 02:https://www.cnblogs.com/myx12345/p/9436953.html 03: 04: 05:https://www.cnblogs.com/myx12345/p ...

随机推荐

  1. Hibernate(开放源代码的对象关系映射框架)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  2. StringBuffer(线程安全)StringBuilder(非线程安全)

    StringBuffer属于线程安全,相对为重量级 StringBuilder属于非线程安全,相对为轻量级 线程安全的概念: 网络编程中许多线程可能会同时运行一段代码.当每次运行结果和单独线程运行的结 ...

  3. [POJ2420]A Star not a Tree?(模拟退火)

    题目链接:http://poj.org/problem?id=2420 求费马点,即到所有其他点总和距离最小的点. 一开始想枚举一个坐标,另一个坐标二分的,但是check的时候还是O(n)的,复杂度相 ...

  4. PHP入门二【PHP include 和 require的区别】

    include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中.包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP.HTM ...

  5. IE11 iframe alternative

    <OBJECT classid=clsid:8856F961-340A-11D0-A96B-00C04FD705A2> <PARAM NAME=Location VALUE=http ...

  6. mySQL数据库Sql语句执行效率检查--Explain命令

    mysql性能的检查和调优方法 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的 ...

  7. Word,PDF,PPT,TXT之间的转换方法

    来源: 刘波的日志 一.把PPT转WORD形式的方法 1.利用"大纲"视图 打开PPT演示文稿,单击"大纲",在左侧"幻灯片/大纲”任务窗格的“大纲” ...

  8. MIT牛人解说数学体系

    https://www.douban.com/group/topic/11115261/ 在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进. 为什 ...

  9. HTML5 十大新特性(五)——SVG绘图

    相对于canvas绘图,SVG是一种绘制矢量图的技术.全称叫做Scalable Vector Graphics,可缩放的矢量图,在2000年就已经存在,H5把它纳入了标准标签库,并进行了一些瘦身.需要 ...

  10. j.APR连接器整体框图(含SSL实现分析)

    APR连接器的思路和bio,nio的整体架构也是类似的,可以看到下面的整体框图: 第一个区别是,对于从Acceptor线程中的socket解析这块,无论是nio还是bio都是在Acceptor线程内直 ...