250:

给一个串S,可以做这样的操作,可以将串中的一种字母变成另一种字母,代价是该种字母的数量。求解的问题是,最小的代价将串S变成回文串。

根据回文关系,我们可以形成等价对应关系,a与b等价对应说明a和b必须是同种字母,根据这个关系,我们可以得到一个图,每个连通块表示要变成一种相同的字母,而这个操作的最小代价就是将连通块中除出现次数最多的字母全部都转变成出现次数最多的字母。

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
using namespace std; bool mm[][];
int cnt[];
bool used[]; class GooseTattarrattatDiv1 {
public:
int getmin(string S) {
memset(cnt, , sizeof(cnt));
memset(mm, false, sizeof(mm));
memset(used, false, sizeof(used));
int n = S.size();
for (int i = ; i < n; i++) {
mm[S[i]][S[n - - i]] = true;
mm[S[n - - i]][S[i]] = true;
cnt[S[i]]++;
}
int res = ;
for (int i = ; i < ; i++) {
int sum = , max = ; dfs(i, sum, max);
res += (sum - max);
}
return res;
}
void dfs(int i, int& sum, int& max) {
used[i] = true;
sum += cnt[i];
if (cnt[i] > max) max = cnt[i]; for (int j = ; j < ; j++) {
if (mm[i][j] && used[j] == false) {
dfs(j, sum, max);
}
}
}
};

500:

有R,G,B三种齿轮,不同颜色齿轮之间不会相接,相接的关系通过graph给出,同种颜色齿轮旋转方向相同,旋转方向一共有两种:顺时针与逆时针。求解如何去掉最少的齿轮使得该graph能相容,即可以找到某种旋转顺序使得不会发生矛盾(矛盾指相接的两个齿轮旋转方向相同)。

同种颜色的点归于一个集合,因此我们有三个集合,R,G,B,集合内的点不会有边,这个图由三个二分图组成,因为有3个集合,枚举一下齿轮的旋转方向,一共有三种情况:RG同向,GB同向,BR同向。于是问题转换成这三种情况中旋转最小值,对于每个情况,去掉最少的齿轮使其不矛盾便是一个最小点覆盖问题,二分图的最小点覆盖可以转变成二分图的最大匹配问题。

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; class GearsDiv1 {
private:
vector<int> left, right;
vector<string> G;
bool s[];
int link[];
public:
int getmin(string color, vector <string> graph) {
vector<int> r, g, b;
for (int i = ; i < color.length(); i++) {
if (color[i] == 'R') r.push_back(i);
else if (color[i] == 'G') g.push_back(i);
else if (color[i] == 'B') b.push_back(i);
}
int rg = max_bimatch(r, g, graph);
int gb = max_bimatch(g, b, graph);
int br = max_bimatch(b, r, graph);
return min(rg, min(gb, br));
}
int max_bimatch(vector<int> l, vector<int> r, vector<string> graph) {
//
left = l; right = r; G = graph; int res = ;
memset(link, -, sizeof(link));
for (int i = ; i < left.size(); i++) {
memset(s, false, sizeof(s));
if (dfs(i)) res++;
} return res;
}
bool dfs(int i) {
for (int j = ; j < right.size(); j++) {
if (G[left[i]][right[j]] == 'Y' && s[right[j]] == false) {
s[right[j]] = true;
if (link[right[j]] == - || dfs(link[right[j]])) {
link[right[j]] = i;
return true;
}
}
}
return false;
}
};

SRM589的更多相关文章

  1. SRM589 DV1 250 回文字符串

    其实这道题挺简单的,不过刚开始我钻了一个错误的死胡同.想明白之后才发现. 题目要求用最少的时间来将一个字符串变成回文字符串.(具体题目参看topcoder srm589 DV1 250分值的题目,不便 ...

随机推荐

  1. Poj 2262 / OpenJudge 2262 Goldbach's Conjecture

    1.Link: http://poj.org/problem?id=2262 http://bailian.openjudge.cn/practice/2262 2.Content: Goldbach ...

  2. java实现多模匹配算法

    这个是好几年前写的了.都统一放到cnblogs上面. --------------------------------Node ---------------------------------- p ...

  3. Geographic Coordinate Systems

    Coordinate Systems Geographic Coordinate Systems This is an archive of a previous version of the Arc ...

  4. 在Tomcat中部署Java Web应用程序

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署      静态部署指的是我们在服务器启动之前部 ...

  5. Python Generators vs Iterators

    http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators iterato ...

  6. PhpExcel数组输出到Excel浏览器下载

    经常是mysql查出二维数组,并且数组的带key也是有意义的,考虑到经常用,就打算弄个函数出来,方便以后用! 相对是规范的数组哈,具体可看下$data数组: 生成的excel第一行是对应的key: 直 ...

  7. 如何实现zs无限期试用

    要删除的文件有两个,分别是.zs与10_0..zs保存的是版本号,10_0保存的是注册码,这两个文件存在的原理是:zend studio 每次启动的会检查这两个文件的创建时间,和当前日期对比,超过30 ...

  8. ecshop改造读写分离配置与改造

    前两天配置好了mysql主从方式,今天就拿ecshop练习读写分离.以下代码仅供学习参考,不成熟的地方,还需完善. <?php $db_name = "ecshop"; $p ...

  9. 如何在eclipse中配置Selenium

    1, Install python 33.(Python 27也可以) 2, Setup Selenium If you did not install Easy_install module, yo ...

  10. 基于C#利用金山取词组件实现屏幕取词功能

    这个程序在网上有很多例子,近期要做的项目中有和这个有某些一点点相似的地方,就练练,发现在本机上(Win 7 64位)不能实现其功能,可能原因是API组件太老了吧,毕竟金山大佬公布他的组件是2005年, ...