HDU4628
2024-08-29 21:19:52
/*状态转移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
最新文章
- C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
- Android Shape总结
- golang下的grpc
- 浅谈数位DP
- 快捷键的记录,Word和PPT的一些常用操作
- net use与shutdown配合使用,本机重启远程服务器
- 用wamp配置的环境,想用CMD连接mysql怎么连
- NSS_11 Server Error in &#39;/&#39; Application
- 【零基础学习iOS开发】【02-C语言】09-流程控制
- 在桌面Linux环境下开发图形界面程序的方案对比
- “NET网络”进行中,多管齐下的人才力挫“”粗俗
- IOS发展--他们控制的定义
- ●BZOJ 4318 OSU!
- Linux内核原理与分析-第二周作业
- B树索引分裂
- solr 7.7.0配置中文分词器的数据类型
- HAOI2016 找相同字符 后缀自动机
- Python爬虫——小说
- [Paper] LCS: An Efficient Data Eviction Strategy for Spark
- 有2个表,结构相似,有一个字段关联,现在怎么把A表的数据添加到B表中,条件是A表不在B表的数据?? 请各位高手多多指点,是oracle的数据库
热门文章
- DMSFrame 之查询表达式用法(一)
- MAC必装神器
- 【SR】Example-based
- VC++6.0 打开原来工程突然特别慢或者打不开?
- Microsoft Visual C++ 2005 Redistributable---win下安装软件“嘭”的一声报错!
- resolution will not be reattempted until the update interval of vas has elap
- Leetcode-Convert Sorted List to BST.
- 网络模型+三次握手+四次挥手+DNS+HTTPS
- 第一份PHP程序
- Downgrading an Exchange 2010 Server(Exchange降级)