【 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 ...
随机推荐
- 3.mvc core 文件目录详细的解释
wwwroot 放js css image的文件夹,静态文件. favicon.ico 网站图标.上传文件的话最好在里面新建一个Upload的文件夹进行管理 Controllers 控制器, View ...
- 如何修改Hadoop的默认日志级别,还真是麻烦
鄙人使用的Hadoop版本为2.6.4.Hadoop的默认日志级别为INFO,对于百台以上的集群,如果文件操作频繁的话,NameNode会狂打日志,对性能会有一定的影响. 我们可以通过http://& ...
- idea jrebel6 安装,破解
一.Setting中在线安装JRebel插件,install 二.拷贝下载的jrebel.rar解压后 把里面内容覆盖IDEA插件安装目录中此插件目录之下 下载:http://pan.baidu.co ...
- 【转】}目前比较全的CSS重设(reset)方法总结
在当今网页设计/开发实践中,使用CSS来为语义化的(X)HTML标记添加样式风格是重要的关键.在设计师们的梦想中都存在着这样的一个完美世界:所有的浏览器都能够理解和适用多有CSS规则,并且呈现相同的视 ...
- InfoPackage的更新模式
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- iOS获取当前时间
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // ----------设置你想要的格式,hh与HH的区别:分别表示12小时 ...
- LTE Manual ——Logging(翻译)
LTE Manual ——Logging(翻译) (本文为个人学习笔记,如有不当的地方,欢迎指正!) 9 Logging ns-3 日志功能可以用于监测或调试仿真程序的进展.日志输出可以通过 ma ...
- webform分页
前端界面: 当前第[<asp:Label ID="Label_nowpage" runat="server" Text="Label" ...
- CSS 文字两端对齐
<!DOCTYPE HTML> <html> <head> <title></title> <meta http-equiv=&quo ...
- java Collections.sort()实现List排序自定义方法
方法一: package testSimple; import java.util.ArrayList; import java.util.Collections; import java.util. ...