FZU - 2218 Simple String Problem(状压dp)
题目链接:点击查看
题目大意:给出一个长度为n,含有k个不同字母的字符串,我们的任务是从中挑选出两段连续的子串,要求其长度的乘积最大,还有一个限制条件是,这两个子串不能互相包含相同的字母
题目分析:因为k给的特别小,我们可以用状态压缩来解决,可是,我太弱了,根本没思路,还是借鉴的大佬的思路,用异或运算来实现状态转移,具体的看代码吧,这是这两天以来写过的最短的代码了。。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<cmath>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=(1<<16)+10; int dp[N];//记录相应状态的区间长度int main()
{
// freopen("input.txt","r",stdin)int w;cin>>w;while(w--){int n,k;scanf("%d%d",&n,&k);string str;cin>>str;memset(dp,0,sizeof(dp));//初始化所有状态为0for(int i=0;i<str.size();i++)//区间起点{int val=0;for(int j=i;j<str.size();j++)//区间终点{val|=(1<<(str[j]-'a'));//如果区间中出现了某种字母,对其进行记录dp[val]=max(dp[val],j-i+1);//对所有区间长度进行对应的记录}}for(int i=0;i<(1<<k);i++)//这里是用子状态来更新状态,遍历所有的状态for(int j=0;j<k;j++)//在遍历所有的字母if(i&(1<<j))//如果该字母属于本次状态,则取异或,可以得到除掉该字母外的子状态
//举个例子:比如10110这个状态,他包含了10100等等状态,而10100又包含了10000和00100两个状态
//那如何用异或处理呢?还是用10110这个状态来讲,我们检测到第一个1属于这个状态之中,那么我们接下来
//用10000和10110来异或,结果恰好是00110,便是除去第一个1后的状态,然后遍历到第二个1,就是
//00100和10110取异或,结果是10010,也是去掉了第二个1后的状态,通过这样可以遍历所有子状态,达到
//更新的目的,不得不说,这个转移方程真的是太强了dp[i]=max(dp[i],dp[i^(1<<j)]);//转移方程int ans=0;for(int i=0;i<(1<<k);i++)ans=max(ans,dp[i]*dp[i^((1<<k)-1)]);//记录每个状态和它补集状态区间长度的乘积cout<<ans<<endl;}return 0;
}
FZU - 2218 Simple String Problem(状压dp)相关推荐
- CF11D A Simple Task(状压DP)
\(solution:\) 思路大家应该都懂: 状压DP:\(f[i][j]\),其中 \(i\) 这一维是需要状压的,用来记录19个节点每一个是否已经走过(走过为 \(1\) ,没走为 \(0\) ...
- CF11D-A Simple Task【状压dp】
正题 题目链接:https://www.luogu.com.cn/problem/CF11D 题目大意 给出nnn个点mmm条边的一张简单无向图,求它的简单环的个数. 1≤n≤191\leq n\le ...
- FZU-2218 Simple String Problem(状态压缩DP)
原题地址: 题意: 给你一个串和两个整数n和k,n表示串的长度,k表示串只有前k个小写字母,问你两个不含相同元素的连续子串的长度的最大乘积. 思路: 状态压缩DP最多16位,第i位的状态表示第i位字母 ...
- 【校内互测】Sunshine’s string(merge) (状压dp)
Sunshine's string(merge.cpp) [问题描述] 无聊的Sunshine大爷开始研究字符串.他找来了一个长度为n的01字符串,并制定了一些规则:每次可以将k个字符合并,得到一个新 ...
- 【思维题 状压dp】APC001F - XOR Tree
可能算是道中规中矩的套路题吧-- Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...
- CodeForces - 1550E Stringforces(二分+状压dp)
题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,只包含前 kkk 个小写字母以及通配符 ???,现在可以将通配符替换成任意的前 kkk 个字母中的一个.设 f[i]f[i]f[i] 为 ...
- 【2019牛客暑期多校训练营(第五场)- E】independent set 1(最大独立集,状压dp)
题干: 链接:https://ac.nowcoder.com/acm/contest/885/E 来源:牛客网 Note: For C++ languages, the memory limit is ...
- Codeforces Beta Round #8 C. Looking for Order 状压dp
题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 second ...
- [SGU223]Little Kings(状压DP)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=223 题意:n*n个格子里放k个王(走相邻8个格子),问不互相碰到的放法一共多少个. ...
最新文章
- sqlalchemy中的first_or_404()和get_or_404()使用(前端页面可视化操作——查询和添加)
- 做科研已经很辛苦了,为什么还要做PPT汇报?
- Paxos算法之旅(四)zookeeper代码解析--转载
- php 多选的 二进制,PHP二进制操作初体验
- java性能分析与问题定位 实战
- 用Java读取/写入压缩和非压缩文件
- docker mysql主从_使用docker 实现MySQL主从同步/读写分离
- python遍历二维数组_在Python中遍历二维数组?
- Java并发编程(07):Fork/Join框架机制详解
- 如何系统自学python_如何系统地自学 Python?
- python的workbook_python openpyxl 操作 excel
- python中pprint是干什么的_Python中的pprint折腾记
- C# Linq以及反射总结
- 深入浅出 Javascript API(一)--基本框架
- 牛客小白月赛17 - J - 计数(组合数学隔板法)
- 好豆直播功能需求分析与优先级排序
- [CTF]Brainfuck/Ook!编码
- QQ空间说说刷赞网页版开放公测
- Perl 中关于 LWP::UserAgent等模块用法
- P6857 梦中梦与不再有梦