至多删三个字符

L3-020 至多删三个字符 (30 分)

给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?

输入格式:

输入在一行中给出全部由小写英文字母组成的、长度在区间 [4, 10?6??] 内的字符串。

输出格式:

在一行中输出至多删掉其中 3 个字符后不同字符串的个数。

输入样例:

ababcc

输出样例:

25

提示:

删掉 0 个字符得到 "ababcc"。

删掉 1 个字符得到 "babcc", "aabcc", "abbcc", "abacc" 和 "ababc"。

删掉 2 个字符得到 "abcc", "bbcc", "bacc", "babc", "aacc", "aabc", "abbc", "abac" 和 "abab"。

删掉 3 个字符得到 "abc", "bcc", "acc", "bbc", "bac", "bab", "aac", "aab", "abb" 和 "aba"。

Solution:注意去重是到最近的。

#include <bits/stdc++.h>

using namespace std;
const int maxn=1e6+10;
char str[maxn];
long long dp[maxn][6];
int main()
{
    scanf("%s",str+1);
    dp[0][0]=1;
    int n=strlen(str+1);
    for(int i=1;i<=n;i++){
        for(int j=0;j<=3;j++){
            if(!dp[i-1][j])continue;
            if(j<3)dp[i][j+1]+=dp[i-1][j];
            dp[i][j]+=dp[i-1][j];
            for(int k=i-1;k>=1&&(i-k)<=j;k--){
                 if(str[i]==str[k]){
                    dp[i][j]-=dp[k-1][j-(i-k)];
                    break;
                 }
            }
        }
    }
    cout<<dp[n][0]+dp[n][1]+dp[n][2]+dp[n][3]<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/czy-power/p/10545081.html

时间: 2024-10-09 05:42:09

至多删三个字符的相关文章

PTA 团体程序设计天梯赛 L3-020 至多删三个字符

$f[i][j]$表示到第$i$个字符,已经删去了$j$个字符的方案数. 显然的转移: $f[i][j] = f[i - 1][j] + f[i - 1][j - 1]$ 但是这样会有重复,我们考虑什么情况会重复. 比如说:'aabab'中的'bab',我们删去'ba',得到'aab',删去'ab'得到'aab',两者是相同的 1 2 3 4 5 a a b a b 我们假设之前的每一位存的都是没有重复的方案数 就刚才的情况,我们发现当我们递推到第$5$个位置的时候,删去第三位和第四位的'ba'

[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 palindrome. Example 1: Input: "aba" Output: True Example 2: Input: "abca" Output: True Explanation: You could delete the character 'c'. 思

LINUX设备驱动程序笔记(三)字符设备驱动程序

      <一>.主设备号和次设备号        对字符设备的访问时通过文件系统内的设备名称进行的.那些设备名称简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可通过ls -l命令输出的第一列中的'c'来识别.块设备同样位于/dev下,由字符'b'标识 crw-rw----  1 root root    253,   0 2013-09-11 20:33 usbmon0 crw-rw----  1 root root    253,   1 2013-09

c语言:先后输出BOY三个字符

先后输出BOY三个字符. 程序: #include<stdio.h> int main() { char   a='B', b = 'O', c = 'Y'; putchar(a); putchar(b); putchar(c); putchar('\n'); return 0; } 结果: BOY 请按任意键继续. . .

c语言:从键盘输入BOY三个字符,然后把它们输出到屏幕。

从键盘输入BOY三个字符,然后把它们输出到屏幕. 程序: #include<stdio.h> int main() { char a,b,c; printf("请输入字符:"); a=getchar();//注意getchar一次只能读入1个字符 b=getchar(); c=getchar(); putchar(a); putchar(b); putchar(c); putchar('\n'); return 0; } 结果: 请输入字符:BOY BOY 请按任意键继续.

输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符。

ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成,之间无空格. 输出 对于每组输入数据,输出一行,字符中间用一个空格分开. 样例输入 2 qwe asd 样例输出 e q w a d s #include <iostream> using namespace

windows自带记事本导致文本文件(UTF-8编码)开头三个字符乱码问题

在windows平台下,使用系统的记事本以UTF-8编码格式存储了一个文本文件,但是由于Microsoft开发记事本的团队使用了一个非常怪异的行为来保存UTF-8编码的文件,它们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,所以我们就会遇到很多不可思议的问题,比如,网页第一行可能会显示一个"?",明明正确的程序一编译就报出语法错误,等等. 下面为一段测试程序,由记事本编辑的文本文件导致文件开头前三个字符乱码. #include <stdio.h> #de

【c语言】先后输出BOY三个字符

// 先后输出BOY三个字符 #include <stdio.h> int main() { char a = 'B'; char b = 'O'; char c = 'Y'; putchar(a); putchar(b); putchar(c); printf("\n"); return 0; } <img src="http://img.blog.csdn.net/20150423121000488?watermark/2/text/aHR0cDovL2

【c语言】从键盘输入BOY三个字符,然后把它们输出到屏幕

// 从键盘输入BOY三个字符,然后把它们输出到屏幕 #include <stdio.h> int main() { char a,b,c; printf("请输入三个字符:"); a = getchar(); b = getchar(); c = getchar(); putchar(a); putchar(b); putchar(c); putchar('\n'); return 0; } <img src="http://img.blog.csdn.n