problem1 link

令$f[x1][y1][x2][y2]$表示矩形(x1,y1)(x2,y2)中能选出的最大值。dp即可。

problem2 link

这个题应该有更好的递推公式。

我的做法是这样的。设$f[i]$表示$i$时的答案,令$g[i]=f[i]-f[i-1]$。通过暴力计算$g$的前几项,发现$g$的公式为

$g(n+2)=a(n)=\frac{(2n+3)*(6n^4+36n^3+76n^2+66n+5)}{960}-\frac{(-1)^n}{64}$

problem3 link

由于对于一个节点,其对于某一种tree只能选择至多一次,因此可以对每种tree依次进行处理。

对于tree的某一种,找到target中与其同构的所有子树,然后进行dp即可。 设$f[mask]$将$mask$对应的边反转的最小代价。

code for problem1

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class DonutsOnTheGridEasy { public int calc(String[] grid) {
final int n = grid.length;
final int m = grid[0].length();
if (n < 3 || m < 3) {
return 0;
}
int[][] h = new int[n + 1][m + 1];
int[][] v = new int[n + 1][m + 1];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
h[i + 1][j + 1] = h[i + 1][j];
if (grid[i].charAt(j) == '0') {
h[i + 1][j + 1] += 1;
}
}
}
for (int j = 0; j < m; ++j) {
for (int i = 0; i < n; ++i) {
v[i + 1][j + 1] = v[i][j + 1];
if (grid[i].charAt(j) == '0') {
v[i + 1][j + 1] += 1;
}
}
}
int[][][][] f = new int[n + 1][m + 1][n + 1][m + 1];
for (int height = 3; height <= n; ++ height) {
for (int width = 3; width <= m; ++ width) {
for (int i = 1; i + height -1 <= n; ++ i) {
for (int j = 1; j + width -1 <= m; ++ j) {
int i1 = i + height - 1;
int j1 = j + width -1; f[i][j][i1][j1]= Math.max(f[i][j][i1][j1], f[i + 1][j][i1][j1]);
f[i][j][i1][j1]= Math.max(f[i][j][i1][j1], f[i][j][i1 - 1][j1]);
f[i][j][i1][j1]= Math.max(f[i][j][i1][j1], f[i][j + 1][i1][j1]);
f[i][j][i1][j1]= Math.max(f[i][j][i1][j1], f[i][j][i1][j1 - 1]); if (!check(i, j, i1, j1, h, v)) {
continue;
}
f[i][j][i1][j1]= Math.max(f[i][j][i1][j1], f[i + 1][j + 1][i1 - 1][j1 - 1] + 1);
}
}
}
}
return f[1][1][n][m];
} boolean check(int x1, int y1, int x2, int y2, int[][] h, int[][] v) {
return h[x1][y2] - h[x1][y1 - 1] == y2 - y1 + 1
&& h[x2][y2] - h[x2][y1 - 1] == y2 - y1 + 1
&& v[x2][y1] - v[x1 - 1][y1] == x2 - x1 + 1
&& v[x2][y2] - v[x1 - 1][y2] == x2 - x1 + 1;
}
}

  

code for problem2

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class ConvexHexagons { final static int mod = 1000000007;
final static long rev960 = pow(960, mod - 2);
final static long rev64 = pow(64, mod - 2); public int find(int N) {
if (N < 3) {
return 0;
}
int ans = 0;
for (int i = 3; i <= N; ++i) {
ans += cal(i - 2);
ans %= mod;
}
return ans;
} static long pow(long a, long b) {
a %= mod;
long ans = 1;
while (b > 0) {
if (1 == (b & 1)) {
ans = ans * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return ans;
} long cal(long n) {
long A = (2 * n + 3) % mod;
long B = (6 * pow(n, 4) + 36 * pow(n, 3) + 76 * pow(n, 2) + 66 * n + 5) % mod;
long ans = A * B % mod * rev960 % mod;
if (1 == (n & 1)) {
ans += rev64;
}
else {
ans -= rev64;
}
ans %= mod;
if (ans < 0) {
ans += mod;
}
return ans;
} }

  

code for problem3

import java.util.*;

public class ActivateTree {

	List<Edge> alledges = null;
List<Edge> currentTree = null;
List<List<Integer>> mask = new ArrayList<>();
boolean[] visited = null; public int minCost(String[] trees, String target, int[] costs) {
alledges = getEdges(target); int n = 0;
for (int i = 0; i < alledges.size(); ++ i) {
n = Math.max(n, alledges.get(i).x + 1);
n = Math.max(n, alledges.get(i).y + 1);
} for (int i = 0; i < n; ++ i) {
mask.add(new ArrayList<>());
} final int m = alledges.size();
int[][] f = new int[2][1 << m];
Arrays.fill(f[0], -1);
visited = new boolean[m];
f[0][0] = 0;
for (int i = 0; i < trees.length; ++ i) {
currentTree = getEdges(trees[i]);
for (int j = 0; j < n; ++ j) {
mask.get(j).clear();
}
dfs(0, new int[currentTree.size()]); for (int u = 0; u < n; ++ u) {
for (int j = 0; j < (1 << m); ++ j) {
f[1][j] = f[0][j];
}
for (int s = 0; s < (1 << m); ++ s) {
for (int t: mask.get(u)) {
if (f[1][s ^ t] != -1) {
if (f[0][s] == -1 || f[0][s] > f[1][s ^ t] + costs[i]) {
f[0][s] = f[1][s ^ t] + costs[i];
}
}
}
}
}
}
return f[0][(1 << m) - 1];
} Map<Integer,Integer> map0 = new HashMap<>();
Map<Integer,Integer> map1 = new HashMap<>(); void dfs(int id, int[] ch) {
if (id == currentTree.size()) {
int st = 0;
for (int i : ch) {
st |= 1 << i;
}
int rt = alledges.get(ch[0]).x;
while (true) {
boolean tag = false;
for (int i = 0; i < ch.length; ++ i) {
if (alledges.get(ch[i]).y == rt) {
rt = alledges.get(ch[i]).x;
tag = true;
break;
}
}
if (!tag) {
break;
}
}
if (mask.get(rt).contains(st)) {
return;
} map0.clear();
map1.clear();
for (int i = 0; i < ch.length; ++ i) {
int x = alledges.get(ch[i]).x;
int y = alledges.get(ch[i]).y;
int xx = currentTree.get(i).x;
int yy = currentTree.get(i).y;
for (int j = 0; j < 2; ++ j) {
int u = (j == 0)? x : y;
int v = (j == 0)? xx : yy;
if (map0.containsKey(u)) {
if (map0.get(u) != v) {
return;
}
if (!map1.containsKey(v) || map1.get(v) != u) {
return;
}
}
else {
if (map1.containsKey(v)) {
return;
}
map0.put(u, v);
map1.put(v, u);
}
}
} mask.get(rt).add(st);
return;
}
for (int i = 0; i < alledges.size(); ++ i) {
if (!visited[i]) {
visited[i] = true;
ch[id] = i;
dfs(id + 1, ch);
visited[i] = false;
}
}
} static List<Edge> getEdges(String target) {
List<Edge> result = new ArrayList<>();
String[] all = target.split("\\s+"); for (int i = 1; i < all.length; ++ i) {
int p = Integer.valueOf(all[i]);
result.add(new Edge(p, i));
}
return result;
} static class Edge {
int x, y;
Edge() {}
Edge(int x, int y) {
this.x = x;
this.y = y;
}
}
}

  

topcoder srm 455 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. ZOJ 3690 Choosing number(矩阵)

    Choosing number [题目链接]Choosing number [题目类型]矩阵 &题解: 这题就和已经dp极像了,所以找方程就很困难了.可以这样找: 设f(n)是前n-1个人已经 ...

  2. laravel架构

    1.Laravel 5.1 中的异常处理器和HTTP异常处理实例教程 http://laravelacademy.org/post/1867.html 2.laravel 集成sentry,sentr ...

  3. JS实例2

    进度条 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...

  4. JSP—连接池

    1:为什么要使用连接池? 解决频繁连接释放造成的资源浪费 2:配置好的数据库连接池也是以数据源DateSource的形式存, 连接池的实现类负责建立与数据库的连接. 3:使用连接池关闭资源的区别? 使 ...

  5. 终极解决liunx GUI 无法显示中文的问题。

    为linux安装字体 Linux字体文件放在/usr/share/font/,只要将字体文件拷贝到这里就可以了.这里示例安装Windows的所有字体. 2,复制Windows下 的所有字体.cd命令切 ...

  6. 阿里云ECS服务器 常见问题(1)

    无法在外网访问服务器的公网ip 解决方法: 在阿里云 云服务器ECS-安全组规则 添加端口 可更根据阿里的教程来 配置完成后即可访问!

  7. 如何登录Sitecore CMS

    这是关于学习如何使用和开发Sitecore CMS的系列文章中的第一篇. 在使用Sitecore CMS之前,必须先登录.新Sitecore开发人员常见的一个问题是“我该在哪里登录?” 安装任何版本的 ...

  8. uvalive 4848 Tour Belt

    题意: 一个KTO被定义为一个特殊的连通块,这个连通块满足一个要求,这个连通块中的最短的边大于 与这个连通相连的不属于这个连通块的边中的最大值. 给出一个图,统计KTO里面的点有多少个.(一个点可以属 ...

  9. [openjudge-搜索]Knight Moves(翻译与题解)

    题目描述(翻译) somurolov先生,精彩的象棋玩家.声称任何人他都可以从一个位置到另一个骑士这么快.你能打败他吗? 问题 你的任务是写一个程序来计算一个骑士达到从另一点所需要的最少步数,这样你就 ...

  10. 转:C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的)

    转载自:http://hi.baidu.com/cookiemulan/item/82df8ff867dd53cc531c26c7 有时候,为了提高性能和节约资源,我们会为多个控件,指定同一个右键弹出 ...