【 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][y-1]-dp[x+1][y-1]+(dp[x+1][y-1]+1)=dp[x+1][y]+dp[x][y-1]+1。
若str[x]!=str[y],dp[x][y]=dp[x+1][y]+dp[x][y-1]-dp[x+1][y-1]。
#include<cstdio>
#include<cstring>
#define MAXN 1010
#define MOD 10007
char str[MAXN];
int dp[MAXN][MAXN];
int dfs(int x, int y) {
if (dp[x][y] == -) {
if (str[x] != str[y]) {
dp[x][y] = dfs(x + , y) + dfs(x, y - ) - dfs(x + , y - );
} else {
dp[x][y] = dfs(x + , y) + dfs(x, y - ) + ;
}
}
dp[x][y] %= MOD;
return dp[x][y];
}
int main() {
int T;
int ca = ;
int len;
int i;
scanf("%d", &T);
while (T--) {
memset(dp, -, sizeof(dp));
scanf(" %s", str);
len = strlen(str);
for (i = ; i < len; i++) {
dp[i][i] = ;
}
for (i = ; i < len; i++) {
if (str[i] == str[i - ]) {
dp[i - ][i] = ;
} else {
dp[i - ][i] = ;
}
}
printf("Case %d: %d\n", ca++, (dfs(, len - ) + MOD) % MOD);
}
return ;
}
HDU 4633 Who's Aunt Zhang
由Polya得到:
本身到本身的置换有1种,k8+12+54。
沿着一个面的中心旋转90度有3种,k(1+1+3)*(1+1+3)+1+9。
沿着一个面的中心旋转270度有3种,k(1+1+3)*(1+1+3)+1+9。
沿着一个面的中心旋转180度有3种,k(2+2+5)*(2+2+5)+2+18。
沿着正方体的两个对顶点旋转120度有4种,k2+2+9+9+2+2。
沿着正方体的两个对顶点旋转240度有4种,k2+2+9+9+2+2。
沿着正方体的中心,与正方体任意两条对边的中点旋转180度有6种,k4+8+18+8。
#include<cstdio>
#define MOD 10007
int powmod(int a, int b) {
int ans;
for (ans = ; b; b >>= ) {
if (b & ) {
ans *= a;
ans %= MOD;
}
a *= a;
a %= MOD;
}
return ans;
}
int ext_gcd(int a, int b, int &x, int &y) {
int t, d;
if (b == ) {
x = ;
y = ;
return a;
}
d = ext_gcd(b, a % b, x, y);
t = x;
x = y;
y = t - a / b * y;
return d;
} int Invmod(int a, int n) {
int x, y;
if (ext_gcd(a, n, x, y) != )
return -;
return (x % n + n) % n;
}
int main() {
int T;
int ca = ;
int n;
int ans;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
ans = powmod(n, + + );
ans += * powmod(n, );
ans += * powmod(n, );
ans += * powmod(n, );
ans += * powmod(n, );
printf("Case %d: %d\n", ca++, ans % MOD * Invmod(, MOD) % MOD);
}
return ;
}
HDU 4638 Group
询问区间最少可以组成多少段,连续的数可以组成一段。
若x+1与x-1已经出现了,则加入x使得段数-1。
若x+1与x-1都没有出现,则加入x使得段数+1。
其他情况段数不变。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n, m;
bool vis[MAXN];
int arr[MAXN];
int tree[MAXN];
int res[MAXN];
int pos[MAXN];
struct Ask {
int x, y;
int idx;
friend bool operator<(Ask a, Ask b) {
return a.x < b.x;
}
} ask[MAXN];
inline int lowbit(int x) {
return x & -x;
}
void update(int x, int val) {
for (; x < MAXN; x += lowbit(x)) {
tree[x] += val;
}
}
int sum(int x) {
int ans;
for (ans = ; x > ; x -= lowbit(x)) {
ans += tree[x];
}
return ans;
}
int main() {
int T;
int i, j;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (i = ; i <= n; i++) {
scanf("%d", &arr[i]);
pos[arr[i]] = i;
}
for (i = ; i < m; i++) {
scanf("%d%d", &ask[i].x, &ask[i].y);
ask[i].idx = i;
}
sort(ask, ask + m);
memset(tree, , sizeof(tree));
memset(vis, false, sizeof(vis));
for (i = ; i <= n; i++) {
vis[arr[i]] = true;
if (vis[arr[i] - ] && vis[arr[i] + ]) {
update(i, -);
}
if (!vis[arr[i] - ] && !vis[arr[i] + ]) {
update(i, );
}
}
for (i = , j = ; i < m; i++) {
for (; j < ask[i].x; j++) {
if (vis[arr[j] + ]) {
update(pos[arr[j] + ], );
}
if (vis[arr[j] - ]) {
update(pos[arr[j] - ], );
}
vis[arr[j]] = false;
}
res[ask[i].idx] = sum(ask[i].y) - sum(ask[i].x - );
}
for (i = ; i < m; i++) {
printf("%d\n", res[i]);
}
}
return ;
}
HDU 4639 Hehe
dp[i]表示以i结尾的方案数。
dp[i]=dp[i-1]。
若替换“hehe”,dp[i]+=dp[i-4]。
#include<cstdio>
#include<cstring>
#define MAXN 100010
#define MOD 10007
int dp[MAXN];
char str[MAXN];
int main() {
int T;
int ca = ;
int len;
int i;
scanf("%d", &T);
while (T--) {
scanf(" %s", str + );
len = strlen(str + );
dp[] = ;
for (i = ; i <= len; i++) {
dp[i] = dp[i - ];
if (i > && str[i - ] == 'h' && str[i - ] == 'e'
&& str[i - ] == 'h' && str[i] == 'e') {
dp[i] += dp[i - ];
}
dp[i] %= MOD;
}
printf("Case %d: %d\n", ca++, dp[len]);
}
return ;
}
dp[i][j]表示访问了的地点压缩成i,最后访问的是j,它的最小花费。
f[i][j]表示i个人,共同访问的地点压缩成j,它的最小花费。
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#define MAXN 17
#define MAXM 3
#define oo 987654321
using namespace std;
int g[MAXN + ][MAXN + ];
int dis[MAXN + ][MAXN + ];
int dp[ << MAXN][MAXN];
int f[MAXM + ][ << MAXN];
vector<int> island;
void floyd(int n) {
for (int k = ; k < n; k++) {
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
bool getHelp() {
for (int i = ; i < (int) island.size(); i++) {
if (dis[][island[i]] >= oo) {
return false;
}
}
return true;
}
queue<pair<int, int> > q;
int main() {
int T;
int ca = ;
int n, m, p;
int x, y, val;
int i, j, k;
int vis;
int ans;
pair<int, int> head, tmp;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
memset(g, 0x3f, sizeof(g));
memset(dis, 0x3f, sizeof(dis));
for (i = ; i < m; i++) {
scanf("%d%d%d", &x, &y, &val);
x--;
y--;
g[x][y] = min(g[x][y], val);
dis[x][y] = dis[y][x] = g[y][x] = g[x][y];
}
island.clear();
scanf("%d", &p);
for (i = ; i < p; i++) {
scanf("%d", &x);
x--;
island.push_back(x);
}
floyd(n);
if (getHelp()) {
memset(dp, 0x3f, sizeof(dp));
dp[][] = ;
q.push(make_pair(, ));
while (!q.empty()) {
head = q.front();
q.pop();
for (i = ; i < n; i++) {
tmp.first = head.first | ( << i);
tmp.second = i;
if (dp[tmp.first][tmp.second]
> dp[head.first][head.second]
+ g[head.second][tmp.second]) {
dp[tmp.first][tmp.second] = dp[head.first][head.second]
+ g[head.second][tmp.second];
q.push(tmp);
}
}
}
memset(f, 0x3f, sizeof(f));
f[][] = ;
for (i = ; i < ( << n); i += ) {
for (j = ; j < n; j++) {
f[][i] = min(f[][i], dp[i][j]);
}
}
for (i = ; i <= MAXM; i++) {
for (j = ; j < ( << n); j += ) {
for (k = j; k >= ; k = k ? (k - ) & j : -) {
f[i][j] = min(f[i][j],
max(f[i - ][k | ], f[][(j ^ k) | ]));
}
}
}
vis = ;
for (i = ; i < (int) island.size(); i++) {
vis |= << island[i];
}
ans = oo;
for (i = ; i < ( << n); i++) {
if ((i & vis) == vis) {
ans = min(ans, f[][i]);
}
}
} else {
ans = -;
}
printf("Case %d: %d\n", ca++, ans);
}
return ;
}
HDU 4642 Fliping game
若右下角的数为1,则Alice必胜。Alice先把右下角变为0,无论Bob如何操作右下角的数都会变为1。
若右下角的数为0,则Alice必败。Alice会把右下角的数变为1。
#include<cstdio>
int main() {
int T;
int n, m;
int i, j, k;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (i = ; i < n; i++) {
for (j = ; j < m; j++) {
scanf("%d", &k);
}
}
if (k) {
puts("Alice");
} else {
puts("Bob");
}
}
return ;
}
【 2013 Multi-University Training Contest 4 】的更多相关文章
- 【 2013 Multi-University Training Contest 8 】
HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...
- 【 2013 Multi-University Training Contest 7 】
HDU 4666 Hyperspace 曼哈顿距离:|x1-x2|+|y1-y2|. 最远曼哈顿距离,枚举x1与x2的关系以及y1与y2的关系,取最大值就是答案. #include<cstdio ...
- 【 2013 Multi-University Training Contest 6 】
HDU 4655 Cut Pieces 假设n个数构成的总数都分成了n段,总数是n*a1*a2*...*an.但是答案显然不会那么多. 对于相邻的两个ai,ai+1,如果选择相同的颜色,那么就减少了a ...
- 【 2013 Multi-University Training Contest 5 】
HDU 4647 Another Graph Game 如果没有边的作用,显然轮流拿当前的最大值即可. 加上边的作用,将边权平均分给两个点,如果一个人选走一条边的两个点,就获得了边的权值:如果分别被两 ...
- 【 2013 Multi-University Training Contest 3 】
HDU 4622 Reincarnation 枚举字符串的起点,构造后缀自动机,每次插入一个字符,就能统计得到当前不同字串的个数,预处理出所有的询问. #include<cstdio> # ...
- 【 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. ...
- 【 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 ...
- 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump
多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...
- 【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 ...
随机推荐
- Windows使用shipyard
步骤: 1. 安装go语言环境,配置go语言环境变量 如果是64位,GOARCH=amd64 http://my.oschina.net/pandao/blog/161667 2. 找一台linux或 ...
- FastReport使用DataSet作数据源
1.打开FastReport的设计器, 2.选择[File]->[New] 新建FastReport模板. 3.选择[View]->[Data],显示如下,导出Dictionary,保存. ...
- android Fragment 使用
一 .Fragment的理解 Fragment 与activity 相似,但比activity 多出几个方法 ,Fragment的生命周期小于activity 一个Activity 中可以包含多个Fr ...
- 关于Struts、hibernate、spring三大框架详解。
struts 控制用的 hibernate 操作数据库的 spring 用解耦的 Struts . spring . Hibernate 在各层的作用 1 ) struts 负责 web 层 . Ac ...
- CSS3中的伪类选择器详解
类选择器和伪类选择器区别 类选择器我们可以随意起名,而伪类选择器是CSS中已经定义好的选择器,不可以随意起名. 伪类选择器以及伪元素 我们把它放到这里 p.aaas{ text-align: le ...
- (转)assert 断言式编程
编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在任何时候启用 ...
- Oracle笔记二
一.数据库语言分类 二.DML之数据插入 把一个表中的数据查询出来插入另外一个表中. create table student(id number,name varchar2(20),age num ...
- Load Runner录制C/S客户端
1. 打开应用程序 2. 点击如下菜单 弹出窗口如下 3. 点击New,弹出窗口如下,选择Web(HTTP/HTML) 4. 点击Create,弹出窗口 5. 点击OK, ...
- VMware中linux配置2-安装jdk
1.通过共享文件夹,将文件jdk-7u79-linux-x64.tar.gz 复制到/tmp目录下 cp jdk-7u79-linux-x64.tar.gz /tmp 2.解压该文件 tar -zxv ...
- 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)
1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...