Palindrome subsequence HDU - 4632 区间dp|记忆化搜索

// 区间dp
import java.util.Scanner;/**** @author CN*/
public class main {static int mod = 10007;static String l;static int[][] dp = new int[1010][1010];public static void main(String[] args){// TODO code application logic hereint t;Scanner sc = new Scanner(System.in);t = sc.nextInt();for(int i=1;i<=t;i++){ l = sc.next();for(int p=0;p<1010;p++){for(int q=0;q<1010;q++)dp[p][q] = 0;}for(int r=0;r<l.length();r++)dp[r][r] = 1;for(int len = 1;len<l.length();len++){for(int p=0;p<l.length();p++){for(int q=p+len;q<l.length();q++){dp[p][q] = dp[p+1][q] + dp[p][q-1];if(l.charAt(p)!=l.charAt(q))dp[p][q]-=dp[p+1][q-1];else dp[p][q]++;dp[p][q]=(dp[p][q]+mod)%mod; break;}}}System.out.println("Case "+i+": "+dp[0][l.length()-1]);            }}
}



import java.util.Scanner;
// 记忆化搜索写法public class Main {static int mod = 10007;static String l;static int[][] dp = new int[1010][1010];static int dfs(int le,int rt){if(le>rt)return 0;if(le==rt)return 1;if(dp[le][rt]!=-1)return dp[le][rt];dp[le][rt] = (dfs(le+1,rt)+dfs(le,rt-1) - dfs(le+1,rt-1)+ mod)%mod;if(l.charAt(le)==l.charAt(rt))dp[le][rt] = (dfs(le,rt)+dfs(le+1,rt-1)+1)%mod;return dp[le][rt];}public static void main(String[] args){int t;Scanner sc = new Scanner(System.in);t = sc.nextInt();for(int i=1;i<=t;i++){ l = sc.next();for(int p=0;p<l.length();p++){for(int q=0;q<l.length();q++)dp[p][q] = -1;}       System.out.println("Case "+i+": "+dfs(0,l.length()-1));            }}
}

题意就是在一个字符串计数任意可能的回文子串 计算所有子串的数量 每个字串要求先后顺序相同

思路:
也就是根据子串的左右边界定义一个子串用dp[i][j]表示从i到j的所有的回文子串的数量
分析可知 dp[i][j] 可以由两个状态转移得来 也就是dp[i+1][j] 和 dp[i][j-1]之和得来
如果i处的字符不等于j处的字符 需要减去一个公共部分dp[i+1][j-1] 因为以上两个状态中的任意一个状态都会包含这个状态的
信息 所以会多一个dp[i+1][j-1] 不妨减去
如果i字符等于j处字符 也就是可以构成一个新的回文子串 这个数量关系 仍然是dp[i-1][j-1]得来
或者使用记忆化搜索去做 一开始可以把所有值初始化为一个不可能值 比如-1如果这个值搜索到的时候非-1 也就是已经搜索过了
可以直接返回

注意有减法的取模操作 +mod 再%mod
一开始Case后面多了个# WA了好几发 。。。坑啊。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课外阅读(通讯技术的发展史)

课外阅读&#xff08;通讯技术的发展史&#xff09; 人们常把有线固定通信和无线移动通信作为信息基础结构&#xff08;NII/GII&#xff09;的两大组成部分。近年来它们都以明显的快速步伐向前推进&#xff0c;而且进入新世纪后将更加快速发展&#xff0c;为兴旺的信息时代作出…

python学习第19天

pass 转载于:https://www.cnblogs.com/heimajia/p/10636469.html

第十三期:你所了解的javascript?

在介绍JavaScript之前&#xff0c;首先让我们来简单了解一下脚本语言。大家知道&#xff0c;HTML通常用于格式化和链接文本&#xff0c;各种编程语言通常用于向机器发出一系列复杂的指令&#xff0c;而脚本语言是介于HTML和C、Java等编程语言之间的语言。脚本语言是一种简单的语…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第12篇]椭圆曲线上的群理论是什么

这是系列中的第12篇,我们继续数学背景的部分,通过介绍椭圆曲线的群理论… 椭圆曲线群定律是一种在一组椭圆曲线有理点中定义的二元操作来形成一个群的方法.现在,让我们看看到底什么意思,和这个东西怎么用 椭圆曲线和它的有理点 在椭圆曲线中加入群理论 这就是全部了吗 这和密…

python学习第22天

封装 properpty classmathod staticmathod 转载于:https://www.cnblogs.com/heimajia/p/10636515.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第13篇]概述投影点表达的用途的优点

这是52密码学系列中第13篇,我们继续数学背景部分,通过概述投影点表达的使用和优点. TLDR - 在椭圆曲线点上的翻倍和加法操作需要一个域取逆和几个乘法操作.我们考虑域K(特征值既不是2也不是3).给定K上的一个逆运算是比乘法更花费时间的,因此用投影点坐标去计算这些操作是更有效…

第七期:Python 从入门到精通:一个月就够了!

Python 从入门到精通&#xff1a;一个月就够了&#xff01; 对于许多未曾涉足计算机编程的领域「小白」来说&#xff0c;深入地掌握 Python 看似是一件十分困难的事。其实&#xff0c;只要掌握了科学的学习方法并制定了合理的学习计划&#xff0c;Python 从 入门到精通只需要一…

[Leetcode][第97题][JAVA][交错字符串][BFS][动态规划]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 f(i,j) 表示 s 1的前 i个元素和 s2 的前 j个元素是否能交错组成 s3的前 i j 个元素 第 2 步&#xff1a;状态转移方程 p i j - 1 p为s3的长度 第 3 步&#xff1a;考虑初始化 boolean[][] f …

关于Windows下的访问控制模型

在探索Windows操作系统的过程中&#xff0c;发现很多有意思 的东西。 Windows下的访问控制模型也是我在Github上浏览代码时&#xff0c;无意中发现的。 项目地址 https://github.com/Krutonium/Windows-10-Login-Background-Changer 当我们登陆Windows操作系统时&#xff0c;系…

第八期:继美商务部拉黑多家中国公司后,MIT开始审查对华AI合作项目

10 月 9 日&#xff0c;美国麻省理工学院&#xff08;MIT&#xff09;表示&#xff0c;将审查学校与商汤科技&#xff08;SenseTime Group Ltd.&#xff09;的关系&#xff0c;包括一些可能涉及出口管制法规的项目。 北京时间 10 月 8 日&#xff0c;美国商务部正式公布了新一批…

Schrödinger's Knapsack ZOJ - 4019 线性DP

题意&#xff1a;有背包容量为c 给出两个数串 表示两种不同的物品 从物品中任意选多个数 价值是背包剩余空间*选择元素所属数串的系数 问 最大价值分析: 表面上看起来是个背包题 但是空间太大导致不能背 这里发现先放空间小的换来的价值大 所以我们应该先把两个数串排序 然后…

python学习笔记(十 三)、网络编程

最近心情有点儿浮躁&#xff0c;难以静下心来 Python提供了强大的网络编程支持&#xff0c;很多库实现了常见的网络协议以及基于这些协议的抽象层&#xff0c;让你能够专注于程序的逻辑&#xff0c;而无需关心通过线路来传输比特的问题。 1 几个网络模块 1.1 模块socket 网络编…

[Leetcode][第174题][JAVA][地下城游戏][DFS][动态规划]

【问题描述】[中等] 【解答思路】 1. 回溯&#xff08;暴力&#xff09;& 优化 超时&#xff0c;需要优化 public int calculateMinimumHP(int[][] dungeon) {if (dungeon null || dungeon.length 0 || dungeon[0].length 0) {return 0;}int rowLen dungeon.length;in…

第十期:快来了解这五种热门的开发技能

开发人员是热门的工作岗位之一&#xff0c;在Indeed网站的2019年最热门工作排行榜上名次靠前。随着企业对数字化转型项目的需求不断增加&#xff0c;对能够开发这些数字化应用软件的个人的需求随之而来。 开发人员是热门的工作岗位之一&#xff0c;在Indeed网站的2019年最热门工…

蓝桥杯 平方十位数

2017 国赛c/c B组填空题集合平方十位数由0~9这10个数字不重复、不遗漏&#xff0c;可以组成很多10位数字。这其中也有很多恰好是平方数&#xff08;是某个数的平方&#xff09;。比如&#xff1a;1026753849&#xff0c;就是其中最小的一个平方数。请你找出其中最大的一个平方数…

PHP常见面试题

1.mvc是什么?相互间有什么关系? 答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller),也就是控制器,负责业务逻辑 客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,…

第十一期:数据挖掘其实就是为了干这四种事?

数据挖掘主要侧重解决四类问题&#xff1a;分类、聚类、关联、预测。数据挖掘非常清晰的界定了它所能解决的几类问题。这是一个高度的归纳&#xff0c;数据挖掘的应用就是把这几类问题演绎的一个过程。 数据挖掘最重要的要素是分析人员的相关业务知识和思维模式。一般来说&…

[剑指offer]面试题第[49]题[Leetcode][第264题][JAVA][丑数][动态规划][堆]

【问题描述】[中等] 【解答思路】 1. 动态规划 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public int nthUglyNumber(int n) {int a 0, b 0, c 0;int[] dp new int[n];dp[0] 1;for(int i 1; i < n; i) {int n2 dp[a] * 2, n3 dp[…

第十二期:常用的几种大数据架构剖析

常用的几种大数据架构剖析 随着大数据技术的发展&#xff0c;数据挖掘、数据探索等专有名词曝光度越来越高&#xff0c;但是在类似于Hadoop系列的大数据分析系统大行其道之前&#xff0c;数据分析工作已经经历了长足的发展&#xff0c;尤其是以BI系统为主的数据分析&#xff0…

【大数据】获取一篇新闻的全部信息

作业要求来自于&#xff1a;https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2894 给定一篇新闻的链接newsUrl&#xff0c;获取该新闻的全部信息 标题、作者、发布单位、审核、来源 发布时间:转换成datetime类型 点击&#xff1a; newsUrlnewsId(使用正则表达式re)cl…