nyoj 37 回文字符串题解

来源:互联网 发布:centos设置中文输入法 编辑:程序博客网 时间:2024/06/05 16:43

回文字符串

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
输入
第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出
每行输出所需添加的最少字符数
样例输入
1Ab3bd
样例输出
2
设f[i][j]表示从第i个字符到第j个字符要变为回文需要添加的字符个数,由此可以得到状态转移方程为
1、str[i]==str[p]:f[i][j]=f[i+1][j-1];
2、str[i]!=str[p]:f[i][j] = min(f[i][p-1],f[i+1][p]);
代码如下:
#include <iostream>#include<cstring>using namespace std;int f[1010][1010];//f[i][j]表示从i到j要添加的最少的字符个数int main(){    int n;    cin>>n;    while(n--)    {        char str[1010];        cin>>str;        int i,j,k,len = strlen(str);        for(i=0;i<len;i++)            f[i][i] = 0;        for(k=2;k<=len;k++)        {            for(i=0;i<=len-k;i++)            {                int p = i+k-1;                if(str[i] == str[p])                {                    f[i][p] = f[i+1][p-1];                }                else                {                    f[i][p] = min(f[i+1][p],f[i][p-1])+1;                }            }        }        cout<<f[0][len-1]<<endl;        memset(f,0,sizeof(f));    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 主播公司不发工资怎么办 梦幻月卡用完了怎么办 网易星球实名认证通过不了怎么办 认证过荔枝主播怎么办 苹果手机相机不对焦怎么办 苹果手机摄像头不能对焦了怎么办 闪电邮里面邮件太多怎么办 苹果手机和助理打不开怎么办 苹果我的世界打不开怎么办 ps试用7天到期了怎么办 皮肤锁不住水份怎么办 硫酸弄到皮肤上怎么办 直播时图像反看怎么办 快手直播权限被收回怎么办 快手直播权限被收回了怎么办 腾讯手游助手玩游戏卡怎么办 电脑直播视频打不开了怎么办 平板进水开不了机怎么办 苹果平板进水开不了机怎么办 苹果平板电脑进水了怎么办 电脑换主机以前的文件怎么办 货车卖了没过户怎么办 微交易出金不了怎么办 直播时出现央视影音客户端怎么办 qq账号暂时无法登录怎么办 饿了吃东西胃疼怎么办 早上不吃饭胃疼怎么办 孕晚期胃疼呕吐怎么办 胃疼了一晚上怎么办 微信视频图像倒立怎么办 ps链接图层锁定怎么办 慕课过时间了怎么办 异地恋又要考研怎么办 阴阳师手机绑定上限了怎么办 高考口令卡丢了怎么办 网易将军令换手机了怎么办 须弥bb有弱点土怎么办 战网密码忘记了怎么办 梦三账号忘了怎么办 快手手机号被注册了怎么办 快手该手机号已注册怎么办