当前位置: 首页 > news >正文

Make Palindrome UVA - 10453

题意:添加尽量少的字符使得s串成为回文串,并输出这样得解。

题解:dp[ i ][ j ]表示i~j串需要添加的最少字符。

当s[ i ]==s[ j ]时,dp[ i ][ j ]=dp[ i +1 ][ j - 1 ];

当s[ i ]! =s[ j ]时,dp[ i ][ j ]=min( dp[ i ][ j ],min(dp[ i+1 ][ j ],dp[ i ][ j - 1 ]+1);

头疼的是打印解。

(1)顺着刷

 1 void solve(){
 2     for(int i=0;i<n;i++) { dp[i+1][i]=0; dp[i][i]=0; } 
 3     
 4     for(int len=1;len<n;len++){
 5         for(int i=0;i+len<n;i++){
 6             dp[i][j]=INF;
 7             int j=i+len;
 8             if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1];
 9             else dp[i][j]=min(dp[i][j],min(dp[i+1][j],dp[i][j-1])+1);
10         }
11     }
12     cout<<dp[0][n-1]<<" ";
13 }

(2)逆着刷

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int maxn=1005;
 8 
 9 int n;
10 int dp[maxn][maxn],rec[maxn][maxn];
11 char s[maxn];
12 
13 void solve(){
14     memset(dp,0,sizeof(dp));
15     memset(rec,0,sizeof(rec));
16     
17     for(int i=n-1;i>=0;i--){
18         for(int j=i+1;j<n;j++){
19             if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1];
20             else{
21                 if(dp[i+1][j]>dp[i][j-1]){
22                     dp[i][j]=dp[i][j-1]+1;
23                     rec[i][j]=1;
24                 }
25                 else{
26                     dp[i][j]=dp[i+1][j]+1;
27                     rec[i][j]=-1;
28                 }
29             }
30         }
31     }
32     cout<<dp[0][n-1]<<" ";
33 }
34 
35 void print(int i,int j){
36     if(i>j) return ;
37     if(i==j) printf("%c",s[i]);
38     else if(rec[i][j]==0){
39         printf("%c",s[i]);
40         print(i+1,j-1);
41         printf("%c",s[i]);
42     }
43     else if(rec[i][j]==1){
44         printf("%c",s[j]);
45         print(i,j-1);
46         printf("%c",s[j]);
47         
48     }
49     else{
50         printf("%c",s[i]);
51         print(i+1,j);
52         printf("%c",s[i]);
53     }
54 }
55 
56 
57 int main()
58 {   while(scanf("%s",s)!=EOF){
59         n=strlen(s);
60         
61         solve();
62         print(0,n-1);
63         cout<<endl;
64     }
65     return 0;
66 }

 

转载于:https://www.cnblogs.com/zgglj-com/p/7302379.html

相关文章:

  • 大数据行业发展的九大痛点(个人观点)
  • 【设计模式】 状态模式
  • IT技术人员转行大数据应该考虑哪些问题
  • 日常(关于机房卫生???)
  • 两矩阵相乘的秩的性质_浅析数学中的行列式与矩阵
  • (Python) SOAP Web Service (HTTP POST)
  • 苹果新款笔记本_谷歌发布售价99美元的新款Wi-Fi路由器(全文)_苹果 新款MacBook Pro 13英寸_笔记本新闻...
  • 使用IDEA从github中下载fastdfs-client-java
  • 苹果7手机严重卡顿_iPhone12 实测 5G 网络耗电更快丨苹果官方壳存在严重问题|iphone12|手机壳|续航|蜂窝...
  • [luoguP1666] 前缀单词(DP)
  • JZOJ 8.10 B组总结
  • android oboe 混音_Android之AppBarLayout实现悬停吸附伸缩效果
  • 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍...
  • 中台架构与实现:基于ddd和微服务 下载_提升建设效能 普元信息推出金融科技业务赋能中台软件...
  • 正则表达式和JavaScript中的RegExp对象
  • 【React系列】如何构建React应用程序
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CSS盒模型深入
  • C语言笔记(第一章:C语言编程)
  • ERLANG 网工修炼笔记 ---- UDP
  • Node + FFmpeg 实现Canvas动画导出视频
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Webpack 4x 之路 ( 四 )
  • ------- 计算机网络基础
  • 聊聊hikari连接池的leakDetectionThreshold
  • 树莓派 - 使用须知
  • 小程序测试方案初探
  • 正则表达式
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 回归生活:清理微信公众号
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #define用法
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $.ajax()参数及用法
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)c++ std::pair 与 std::make
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)甲方乙方——赵民谈找工作
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • @hook扩展分析
  • @RequestParam,@RequestBody和@PathVariable 区别