pta l3-20(至多删三个字符)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805046946938880
题意:给定一个长度<=106的字符串,求至多删3个字符可以得到多少种不同的字符串。
思路:很明显这是一道dp题,但我想了好久也想不出来,试过用dfs暴力去解,然后过了两个点,得了16分。看了别人的思路后明白了本题的dp做法。定义dp[maxn][4],dp[i][j]表示前i个字符删掉j个字符可以形成多少种字符串,可以很简单地得出dp[i][j]=dp[i-1][j-1]+dp[i-1][j],即对第i个字符删或不删的两种情况。这是对一般情况,其中还有一些可能出现重复的情况需要删掉:每一次将可能重复的情况全部删掉,那么每一次只用考虑第i个字符可能出现的重复的情况; 例如abcded,对于i=6时,计算dp[6][1]时不会有重复; 计算dp[6][2]时,若删掉ed,与删掉de出现重复,需要减掉删掉ed的情况,删掉ed,即前3个删0个,所以应减dp[3][0]; 计算dp[6][3]时,若删掉ed和abc中的一个,与删掉de和abc中的一个重复,需要减去前一种情况,即删掉前3个中的1个,应减dp[3][1]。
那么不访用pos数组表示每个字符上一次出现的位置,记为tmp,若tmp>0(数组从下标1开始)且j-(i-tmp)>=0时:dp[i][j]-=dp[tmp-1][j-(i-tmp)]。(其中i-tmp即上例中的2,j-(i-tmp)即前tmp-1个数应删掉的字符。另外,最终结果可能超过int表示的范围,所以需用long long。
AC代码:
#include<bits/stdc++.h>
using namespace std; const int maxn=;
typedef long long LL;
char s[maxn];
LL dp[maxn][];
int pos[]; int main(){
scanf("%s",s+);
int len=strlen(s+);
for(int i=;i<=len;++i)
dp[i][]=;
for(int i=;i<=len;++i){
int tmp=pos[s[i]-'a'];
pos[s[i]-'a']=i;
for(int j=;j<=;++j){
dp[i][j]=dp[i-][j-]+dp[i-][j];
if(j-(i-tmp)>=)
dp[i][j]-=dp[tmp-][j-(i-tmp)];
}
}
printf("%lld\n",dp[len][]+dp[len][]+dp[len][]+dp[len][]);
return ;
}
pta l3-20(至多删三个字符)的更多相关文章
- L3-020 至多删三个字符 (30 分)(DP)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805046946938880 学习地址: 2018CCCC-L3 ...
- PTA L3-020 至多删三个字符 (序列dp/序列自动机)
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...
- L3-020 至多删三个字符 (30 分)
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...
- PAT L3-020 至多删三个字符
https://pintia.cn/problem-sets/994805046380707840/problems/994805046946938880 给定一个全部由小写英文字母组成的字符串,允许 ...
- L3-020 至多删三个字符 (30 分) 线性dp
给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串? 输入格式: 输入在一行中给出全部由小写英文字母组成的.长度在区间 [4, 1] 内的字符串. 输 ...
- PTA 团体程序设计天梯赛 L3-020 至多删三个字符
$f[i][j]$表示到第$i$个字符,已经删去了$j$个字符的方案数. 显然的转移: $f[i][j] = f[i - 1][j] + f[i - 1][j - 1]$ 但是这样会有重复,我们考虑什 ...
- [leetcode]680. Valid Palindrome II有效回文II(可至多删一原字符)
Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...
- windows自带记事本导致文本文件(UTF-8编码)开头三个字符乱码问题
在windows平台下,使用系统的记事本以UTF-8编码格式存储了一个文本文件,但是由于Microsoft开发记事本的团队使用了一个非常怪异的行为来保存UTF-8编码的文件,它们自作聪明地在每个文件开 ...
- 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。
题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...
随机推荐
- django相关
后台运行django:https://blog.csdn.net/rnger/article/details/79907884 nohup python manage.py runserver 0.0 ...
- MFC 如何在一个类中使用在其他类中定义的变量或函数
[声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...
- python linux 下开发环境搭建
1.1: 在虚拟环境目录下安装 ipython => pip install ipython 1.2: 简单的使用 => ipthyon => print("heollo ...
- leetcode994
public class Solution { ; ; ; ; ; Queue<int[]> Q = new Queue<int[]>(); int[,] TagGrid; p ...
- 选择、操作web元素-3
11月5日 Selenium 作业 3 登录 51job , http://www.51job.com 输入搜索关键词 "python", 地区选择 "杭州"( ...
- Office2019都有哪些强大功能
前阵子是微软一年一度的Ignite大会.而其中最引人注目.也是与我们一般人最息息相关的消息,当然是Office 2019的正式发布. 尽管Office 2019所更新的功能,对于Office 365的 ...
- HTML Tags
While some tags have a very specific purpose, such as image and video tags, most tags are used to de ...
- unity 解决ScrollRect嵌套滚动问题
在子级有ScrollRect组件的对象添加以下脚本: using UnityEngine; using System.Collections; using UnityEngine.UI; using ...
- 在page cache中的页,如果当时没有进程read或者write,引用计数到底该为多少
在一次偶然的机会,在研究如何降低pagecache占用的过程中,走查了 invalidate_mapping_pages的代码: 通过调用 __pagevec_lookup 在radix树中收集一部分 ...
- Excel导入oracle的几种方法
http://www.jb51.net/list/list_154_1.htm 方法一.使用SQL*Loader这个是用的较多的方法,前提必须oracle数据中目的表已经存在.大体步骤如下:1.将ex ...