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 ;
}

4640 Island and study-sister

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 】的更多相关文章

  1. 【 2013 Multi-University Training Contest 8 】

    HDU 4678 Mine 对于每个空白区域,求SG值. 最后异或起来等于0,先手必败. #pragma comment(linker,"/STACK:102400000,102400000 ...

  2. 【 2013 Multi-University Training Contest 7 】

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

  3. 【 2013 Multi-University Training Contest 6 】

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

  4. 【 2013 Multi-University Training Contest 5 】

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

  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. centos 带S权限的二进制

    早上写的一个用find查找带S权限的,感觉不记一下可惜了. [root@iZ28wg1kditZ ~]# find / -type f -exec ls -al {} \;|awk 'BEGIN {p ...

  2. JArray数组每个JObject对象添加一个键值对

    JArray ja = new JArray(); JObject jo = new JObject(); jo.Add("1","1"); ja.Add(jo ...

  3. 如何在WPF的DiagramControl中绘制一个类型数据关系图的方法

    https://www.devexpress.com/Support/Center/Question/Details/T418156 虽然是在wpf中,但是在win中也可以调用wpf控件,这个太棒了, ...

  4. python连接mysql的驱动

    对于py2.7的朋友,直接可以用MySQLdb去连接,但是MySQLdb不支持python3.x.这是需要注意的~ 那应该用什么python连接mysql的驱动呢,在stackoverflow上有人解 ...

  5. 实验二 用C语言表示进程的调度

    实验二 一. 实验目的 通过模拟进程的调度,进一步了解进程的调度的具体过程. 二. 实验内容和要求 1.进程PCB的结构体定义 2.定义队列 3.输入进程序列 4.排序(按到位时间) 5.输出进程运行 ...

  6. 深入理解BFC和外边距合并(Margin Collapse)

    一.什么是BFC? 1.BFC的概念 BFC全称Block Formatting Context ,直译“块级格式化上下文”,也有译作“块级格式化范围”.它是 W3C CSS 2.1 规范中的一个概念 ...

  7. Java集合框架

    集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...

  8. 深入理解js构造函数

    JavaScript对象的创建方式 在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如: ? 1 2 3 4 5 6 var o1 ...

  9. kali更新源

    原文链接:http://www.cnblogs.com/dunitian/p/4712852.html kali2.0官方下载地址: https://www.kali.org/downloads/ 可 ...

  10. elk

    http://467754239.blog.51cto.com/4878013/1700828/