最长对称子串 || 区间dp || 马拉车

dp[i][j]表示区间[i, j]是否为回文串,若是则为1,不是则为0。

边界条件:

1. 区间长度为1,dp为1。(奇数个字符递推的起始情况)

2. 区间长度为2,且两个字符相同,则dp为1。(偶数个字符递推的起始情况)

3. 右边界不超过n。

转移:

当区间长度大于2时,若dp[l+1][r-1] == 1 && s[l] == s[r],那么dp[l][r] = 1;

第一维遍历区间长度,第二维遍历左端点。通过这两维可以确定区间右端点的位置,若满足条件则转移。由于转移是从小区间到大区间,而最外层循环是从小区间开始,所以递推成立。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; bool dp[1111][1111];
char s[1111];
int main()
{
scanf("%[^\n]", s + 1);//读入一行,gets可能有的oj不支持
int n = strlen(s + 1), r;
int ans = 1;
for(int i = 1; i <= n; ++i) {
for (int l = 1; l <= n; ++l) {
r = l + i - 1;
if (r > n) break;
if (i == 1) dp[l][l] = 1;
else if (i == 2 && s[l] == s[r])
{
dp[l][r] = 1;
ans = max(ans, 2);
}
else if (i > 2 && s[l] == s[r] && dp[l + 1][r - 1] == 1)
{
dp[l][r] = 1;
ans = max(ans, i);
}
}
}
cout << ans << endl;
return 0;
}

列车调度 || 模拟&set使用

遍历,单调递减的一个连续序列一定属于一个队列,若不是,则将该元素与各个队列最小的元素进行比较,找到大于它的最小的那个元素。

我们用set维护各个队列最小的元素集合,而set的大小则为当前需要队列的个数。

#include <bits/stdc++.h>
using namespace std; set<int> s;
int n; int main()
{
scanf("%d", &n);
int mx = 0, x;
for(int i = 0; i < n; i++)
{
scanf("%d", &x);
auto it = s.lower_bound(x);
if(it == s.end()) s.insert(x);
else
{
s.erase(it);
s.insert(x);
}
mx = max(mx, (int)s.size());
}
printf("%d\n", mx);
}

红色警报 || dfs&连通块

如何判断失去一个城市,国家的连通性发生变化?当然是连通块的个数发生变化。

那么考虑连通块的数目将如何变化呢?可能不变,可能变多(注意,可能不止多1),可能变少(由于有一个连通块为单独的一个点,删除这个点后连通块数目-1)。

数据范围很小,那就暴力呀!每次删除一个城市,计算连通块数目,若变多,则说明国家的连通性发生了变化,反之不变。

vis数组表示每次dfs时是否已经访问过该节点,mark数组用于标记已经失去的城市,它们已经无法访问。

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll; vector<int> G[555];
bool vis[555];
bool mark[555]; int cnt; void dfs(int s)
{
vis[s] = 1;//放在这里,而不是下面那个if下面,否则可能从s来,又回到了s
for(int i = 0; i < G[s].size(); ++i)
{
if(!vis[G[s][i]] && !mark[G[s][i]])
{
dfs(G[s][i]);
}
}
} int main()
{
int n, m, x, y, r, s;
cin >> n >> m;
for(int i = 1; i <= m; ++i)
{
scanf("%d %d", &x, &y);
if(x == y) continue;
G[x].push_back(y);
G[y].push_back(x);
}
cin >> r;
for(int j = 0; j < n; ++j)
{
if(!vis[j])
{
dfs(j);
++cnt;
}
}
int pr = cnt;
for(int i = 1; i <= r; ++i)
{
cnt = 0;
fill(vis, vis + n, 0);
scanf("%d", &s);
mark[s] = 1;
for(int j = 0; j < n; ++j)
{
if(!vis[j] && !mark[j])
{
dfs(j);
++cnt;
}
}
if(cnt >= pr + 1)//不一定只多1呀!
cout << "Red Alert: City " << s << " is lost!" << endl;
else cout << "City " << s << " is lost." << endl;
if(i == n) cout << "Game Over." << endl;
pr = cnt;
}
}

p.s. 连通块个数不仅可以dfs,还可以用并查集实现。

这里dfs的方法是最外层大循环一次dfs每个点,若已经访问过,就不dfs,若没有,则dfs,并且连通块数cnt++;

PTA天梯赛校内模拟的更多相关文章

  1. PTA天梯赛训练题L1-064:估值一亿的AI核心代码(字符串模拟)

    Update:smz说regex秒过Orz,yzd记在这里了. 听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久…… 自己还是代码能力太菜了,校 ...

  2. 『ACM C++』 PTA 天梯赛练习集L1 | 001-006

    应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...

  3. PTA 天梯赛 L1

    L1-002 打印沙漏 细节:就是在  (i>j&&i+j<r+1) 这个区间里才有空格,然后就是 for 循环   for(r=1; ;r+=2)  条件不满足之后还会再 ...

  4. 『ACM C++』 PTA 天梯赛练习集L1 | 052-053

    今日刷题,水题水题 ------------------------------------------------L1-052------------------------------------ ...

  5. 『ACM C++』 PTA 天梯赛练习集L1 | 048-49

    今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...

  6. 『ACM C++』 PTA 天梯赛练习集L1 | 040-41

    近期安排 校赛3.23天梯赛3.30华工校赛 4.21省赛 5.12 ------------------------------------------------L1-040----------- ...

  7. 【PTA 天梯赛】L1-046 整除光棍(除法模拟)

    这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整除. 现在,你的程序 ...

  8. 【PTA 天梯赛】L2-028 秀恩爱分得快(模拟)

    古人云:秀恩爱,分得快. 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度.如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K.任意两个人如果同 ...

  9. 【PTA 天梯赛训练】QQ帐户的申请与登陆(散列+set模拟)

    实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5),随后给出N行指令.每行指令的格式为:“命令符(空格)Q ...

随机推荐

  1. .Net/.Net Core 的界面框架 NanUI 发布新版本啦!

    发布前感悟 NanUI 自从上一次更新 NanUI 0.7 已经过去大半年,B站和头条的教学视频也只制作到了第二集. 有朋友悄悄问我是不是发生什么事故我删库跑路了所以那么长时间不更新项目不发布教程,当 ...

  2. AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?

    本文基于JDK-8u261源码分析 1 简介 因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的.所以条件队列的出现为我们提供了主动式地.只有满足指 ...

  3. Lagrange插值C++程序

    输入:插值节点数组.插值节点处的函数值数组,待求点 输出:函数值 代码如下:把printf的注释取消掉,能打印出中间计算过程,包括Lagrange多项式的求解,多项式每一项等等(代码多次修改,这些pr ...

  4. 基于C++语言实现机动车违章处罚管理系统

    这篇文章主要介绍了基于C++语言实现机动车违章处罚管理系统的相关资料,需要的朋友可以参考下 关键代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  5. Zookeeper(4)---ZK集群部署和选举

    一.集群部署 1.准备三台机器,安装好ZK.强烈建议奇数台机器,因为zookeeper 通过判断大多数节点的存活来判断整个服务是否可用.3个节点,挂掉了2个表示整个集群挂掉,而用偶数4个,挂掉了2个也 ...

  6. 咀嚼Lock和Synchronized锁

    1.Synchronized锁 底层是monitor监视器,每一个对象再创建的时候都会常见一个monitor监视器,在使用synchronized代码块的时候,会在代码块的前后产生一个monitorE ...

  7. Mongodb和Hbase的对比

    Mongodb和Hbase的对比 1.Mongodb bson文档型数据库,整个数据都存在磁盘中,hbase是列式数据库,集群部署时每个familycolumn保存在单独的hdfs文件中. 2.Mon ...

  8. 【JVM第八篇--垃圾回收】GC和GC算法

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 1.垃圾 1.1.什么是垃圾 垃圾(Garbage)在Java语言中是指在运行程序中 ...

  9. 一文带你玩转对象存储COS文档预览

    随着"互联网+"的发展,各行各业纷纷"去纸化",商务合同.会议纪要.组织公文.商品图片.培训视频.学习课件.随堂讲义等电子文档无处不在.而要查看文档一般需要先下 ...

  10. Scrum转型(一) 为什么敏捷和Scrum

    1.1 为什么敏捷 由于传统的瀑布模型管理方法无法满足现代某些软件产品开发过程的特点,我们需要使用敏捷的方法(例如,Scrum是一个让我们关注于在短时间里交付高质量商业价值的敏捷框架). 需求频繁变动 ...