/*状态转移f[i]=min(f[i],f[j]+f[i^j]);
就是j状态+i^j状态=i状态,f[i]记录的是从i删除1要的最小步数*/
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=;
int f[N];
int n;
char s[];
int min(int a,int b)
{
if(a<b) return a;
return b;
}
int can(int x)//x代表的是从原来串中取得的子串,比如abcdef,如果x=111000,那么就是取abc,1代表取,0代表不取
{
int i,j;
int l=,r=n-;
while (l<=r)
{
/*两个while是将开头和结尾的每一对1取出来比较*/
while (l<n&&(x&(<<l))==) l++;//当遇到1或l>n时跳出
while (r>=&&(x&(<<r))==) r--;
if (s[l]!=s[r]) return ;//如果取出来的子串不满足回文就返回0
else
{
l++;r--;//继续取对1
}
}
return ;
}
int main()
{
int i,j;
int ca;
scanf("%d",&ca);
while (ca--)
{
scanf("%s",s);
n=strlen(s);
f[]=;//一个都不取
for (i=;i<(<<n);i++)//遍历所有状态,其实可以开个数组,记录一下满足的状态,那样可以省时间吗
{
if (can(i)) f[i]=;//满足回文就可以一步删除
else f[i]=;//不满足就置为一个大于n的数
}
for (i=;i<(<<n);i++)//遍历所有状态
for (j=(i-)&i;j;j=(j-)&i)//删除操作,j是i的下一个状态
f[i]=min(f[i],f[j]+f[i^j]);//i^j是在i中删除j剩下的状态,不如1001^1000=0001,0001就是删除1000剩下的
printf("%d\n",f[(<<n)-]);//结果就是删除n个1需要的最小步数,n个1代表n个都要取到
}
return ;
}

11:42:14

最新文章

  1. C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
  2. Android Shape总结
  3. golang下的grpc
  4. 浅谈数位DP
  5. 快捷键的记录,Word和PPT的一些常用操作
  6. net use与shutdown配合使用,本机重启远程服务器
  7. 用wamp配置的环境,想用CMD连接mysql怎么连
  8. NSS_11 Server Error in &#39;/&#39; Application
  9. 【零基础学习iOS开发】【02-C语言】09-流程控制
  10. 在桌面Linux环境下开发图形界面程序的方案对比
  11. “NET网络”进行中,多管齐下的人才力挫“”粗俗
  12. IOS发展--他们控制的定义
  13. ●BZOJ 4318 OSU!
  14. Linux内核原理与分析-第二周作业
  15. B树索引分裂
  16. solr 7.7.0配置中文分词器的数据类型
  17. HAOI2016 找相同字符 后缀自动机
  18. Python爬虫——小说
  19. [Paper] LCS: An Efficient Data Eviction Strategy for Spark
  20. 有2个表,结构相似,有一个字段关联,现在怎么把A表的数据添加到B表中,条件是A表不在B表的数据?? 请各位高手多多指点,是oracle的数据库

热门文章

  1. DMSFrame 之查询表达式用法(一)
  2. MAC必装神器
  3. 【SR】Example-based
  4. VC++6.0 打开原来工程突然特别慢或者打不开?
  5. Microsoft Visual C++ 2005 Redistributable---win下安装软件“嘭”的一声报错!
  6. resolution will not be reattempted until the update interval of vas has elap
  7. Leetcode-Convert Sorted List to BST.
  8. 网络模型+三次握手+四次挥手+DNS+HTTPS
  9. 第一份PHP程序
  10. Downgrading an Exchange 2010 Server(Exchange降级)