首页 > 其他分享 >HZOJ 切割回文 动态规划

HZOJ 切割回文 动态规划

时间:2022-12-31 11:24:38浏览次数:51  
标签:切割 int HZOJ str left include dp 回文

题面:

 

解题思路:

 本题是一个经典的动态规划的题目。定义动态规划数组dp,dp[i]的含义是子串str[0…i]至少需要切割几次,才能把str[0…i]全部切成回文子串。那么dp[len-1]就是最后的结果。

从左往右依次计算dp[i]的值,i 初始为0,具体计算过程如下:

1、假设 j 处在 0 到 i 之间,如果str[j…i]是回文串,那么dp[i]的值可能是dp[j-1] + 1,其含义是在str[0…i]上,既然str[j…i]是回文串,那么它可以自己作为一个分割的部分,剩下的部分str[0…j-1]继续做最经济的分割,也就是dp[j-1]的值。

2、根据步骤1的方式,让 j 在 i 到 0 的位置上枚举,那么所有可能中最小值就是dp[i]的值,即dp[i] = min{dp[j-1]+1 (0<= j <= i,且str[j…i]必须是回文串)}。

状态转移方程

if( i 到 j 是回文串 )

dp [ i ]  = min ( dp[ i ] , dp[ j-1 ] + 1) 

代码:

#include <iostream>
#include <memory.h>
#include <string>
using namespace std;
string s;
int dp[1005];
int check(int left, int right)
{
    int mid = (left + right ) / 2;
    for( int i = left; i <= mid; i++ )
        if( s[i] != s[right + left - i] )
            return false;
    return true;
}
int main()
{
        cin >> s;
        memset(dp, 0, sizeof(dp));
        int len = s.size();
        for( int i = 2; i <= len; i++ )
            dp[i] = (1<<30);
        dp[0] = -1;dp[1] = 0;
        for( int i = 2; i <= len; i++ )
            for( int j = 1; j <= i; j++ )
        {
            if( check(j-1,i-1) )
                dp[i] = min(dp[i], dp[j-1] + 1);
        }
        cout << dp[len] << endl;
    return 0;
}

 

标签:切割,int,HZOJ,str,left,include,dp,回文
From: https://www.cnblogs.com/anaxiansen/p/17016334.html

相关文章

  • java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切
    文章目录​​前言​​​​一、核心代码​​​​二、测试代码,可直接生成​​​​三、生成的图片如下​​前言代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:​​......
  • java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文
    文章目录​​先看成品​​​​前言​​​​一、项目目录结构​​​​一、海报制作PosterUtil.java工具类​​​​1.描述​​​​2.代码​​​​二、测试生成海报​​​​1......
  • Tomcat WEB服务器日志切割
    cronolog简介cronolog是一个简单的过滤程序,读取日志文件条目从标准输入和输出的每个条目并写入指定的日志文件的文件名模板和当前的日期和时间。当扩展文件名的变化,目前的......
  • HZOJ 传纸条 动态规划
    题面: 解题思路: 用一个三维的数组来记录,dp[b][x1][x2],b表示走的步数,表示两条路径上的某个点的横纵坐标相加之和,x1表示第一条路的某一点的横坐标,y1表示第一条路的某一......
  • 最小回文串
    题目描述回文数是从前往后和从后往前得到的数是相同的。小南接到老师布置的任务,就是对给定的正整数n,找到比n大的最小的那个回文数p。由于n(0 <n< 1010000)可能是一个很......
  • BM13 判断一个链表是否为回文结构
    题目描述思路分析将链表分成两段,最后进行节点的比对问题:将链表均分为两端,可以使用快慢指针的方法,当fast指针运动到最后时,slow指针刚好到中点对于链表长度为奇数或......
  • [NOIP2016 普及组] 回文日期
    [NOIP2016普及组]回文日期题目背景NOIP2016普及组T2题目描述在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。牛牛习惯用\(8\)位数字表示......
  • HZOJ 最长公共上升子序列 动态规划
    题面: 解题思路:首先定义状态dp[i][j]表示序列ai和序列bj的最长公共上升子序列的长度  代码:#include<iostream>#include<cstdio>#include<cstdlib>#incl......
  • P295GH期货订轧、P295GH化学成分、P295GH切割加工
    一、P295GH钢板简介:P295GH是欧标钢碳钢容器钢板,是属锅炉及压力容器用钢板。P295GH钢板执行标准:EN10028。同一系列的还有P355GH、P265H。P295GH说明:本产品具有良好的塑性、......
  • 原木切割二分法
    题目描述​某林业局现在N根原木,长度分别为Xi,为了便于运输,需要将他们切割成长度相等的M根小段原木(只能切割成整数长度,可以有剩余),小段原木的长度越大越好,现求小段原木......