HDU 4632 Palindrome subsequence(DP)
做的我很无奈,当时思路很乱,慌乱之中,起了一个想法,可以做,但是需要优化。尼玛,思路跑偏了,自己挖个坑,封榜之后,才从坑里出来,过的队那么多,开始的时候过的那么快,应该就不是用这种扯淡方法做的。
表示很无奈,没有想到简单的递推式,搞了一个MLE+TLE的方法。
最初版本,多了一个for的复杂度,只要标记一下就好,可是在递归了不好处理,让我折腾了老一会,才弄好。
复制代码
int dfs(int l,int r)
{
int i,ans = ;
if(l == r)
return ;
else if(l > r)
return ;
if(dp[l][r])
return dp[l][r];
ans = dfs(l+,r)+;
for(i = l+; i <= r; i ++)
{
if(str[l] == str[i])
ans = (ans + dfs(l+,i-) + )%MOD;
}
dp[l][r] = ans;
return ans;
} 终于在3点多,改成了递推版本。然后MLE了。
复制代码
for(i = ; i < len; i ++)
{
dp[i][i] = ;
sum[i][i][str[i]-'a'] = ;
}
for(i = ; i < len; i ++)
{
for(j = ; j < len-i; j ++)
{
dp[j][i+j] = (dp[j+][i+j] + + sum[j+][i+j][str[j]-'a'])%MOD;
}
for(j = ; j < len; j ++)
{
if(j == ) continue;
k = str[j-]-'a';
if(i+j- == len) break;
if(str[i+j] == str[j-])
sum[j][i+j][k] = (sum[j][i+j-][k] + dp[j][i+j-] + )%MOD;
else
sum[j][i+j][k] = sum[j][i+j-][k];
}
}
printf("Case %d: %d\n",cas++,dp[][len-]); 终于又改了改,A了。改的,我都看不懂这是什么意思了。
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <string>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
#define MOD 10007
char str[];
int dp[][],sum[][][];
int sum1[][];
int sum2[][];
int main()
{
int len,t,cas = ,i,j,k;
scanf("%d",&t);
while(t --)
{
scanf("%s",str);
len = strlen(str);
for(i = ; i < len; i ++)
{
for(j = ; j < len; j ++)
dp[i][j] = ;
}
for(i = ; i < len; i ++)
{
for(j = ; j < ; j ++)
sum1[i][j] = sum2[i][j] = ;
}
for(i = ; i < len; i ++)
{
dp[i][i] = ;
sum1[i][str[i]-'a'] = ;
}
for(i = ; i < len; i ++)
{
if(i% == )
{
for(j = ; j < len-i; j ++)
{
dp[j][i+j] = (dp[j+][i+j] + + sum1[j+][str[j]-'a'])%MOD;
}
for(j = ; j < len; j ++)
{
if(j == ) continue;
k = str[j-]-'a';
if(i+j- == len) break;
if(str[i+j] == str[j-])
sum2[j][k] = (sum1[j][k] + dp[j][i+j-] + )%MOD;
else
sum2[j][k] = sum1[j][k];
}
}
else
{
for(j = ; j < len-i; j ++)
{
dp[j][i+j] = (dp[j+][i+j] + + sum2[j+][str[j]-'a'])%MOD;
}
for(j = ; j < len; j ++)
{
if(j == ) continue;
k = str[j-]-'a';
if(i+j- == len) break;
if(str[i+j] == str[j-])
sum1[j][k] = (sum2[j][k] + dp[j][i+j-] + )%MOD;
else
sum1[j][k] = sum2[j][k];
}
}
}
printf("Case %d: %d\n",cas++,dp[][len-]);
}
return ;
}
HDU 4632 Palindrome subsequence(DP)的更多相关文章
- HDU 4632 Palindrome subsequence (区间DP)
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- HDU 4632 Palindrome subsequence (2013多校4 1001 DP)
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- HDU 4632 Palindrome subsequence(区间dp)
Palindrome subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65535 K (Java/ ...
- HDU 4632 Palindrome subsequence(区间DP求回文子序列数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...
- HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)
题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...
- HDU 4632 Palindrome subsequence (区间DP)
题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...
- HDU 4632 Palindrome subsequence & FJUT3681 回文子序列种类数(回文子序列个数/回文子序列种数 容斥 + 区间DP)题解
题意1:问你一个串有几个不连续子序列(相同字母不同位置视为两个) 题意2:问你一个串有几种不连续子序列(相同字母不同位置视为一个,空串视为一个子序列) 思路1:由容斥可知当两个边界字母相同时 dp[i ...
- hdu 4632 Palindrome subsequence
http://acm.hdu.edu.cn/showproblem.php?pid=4632 简单DP 代码: #include<iostream> #include<cstdio& ...
- 【HDU】4632 Palindrome subsequence(回文子串的个数)
思路:设dp[i][j] 为i到j内回文子串的个数.先枚举所有字符串区间.再依据容斥原理. 那么状态转移方程为 dp[i][j] = dp[i][j-1] + dp[i+1][j] - dp[i+ ...
随机推荐
- poj1182(食物链)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 49320 Accepted: 14385 Description ...
- IP地址,子网掩码,默认网关
IP地址: 是给每个连接在Internet上的主机分配的一个32bit地址. 地址有两部分组成,一部分为网络地址,另一部分为主机地址. IP地址分为A.B.C.D.E 5类.常用的是B和C两类. 网络 ...
- Android mtk单路录音问题
在单路录音中,有两种情况导致底层录音资源被占用的问题: 1 开启vmLog后,拨打一个电话,挂断电话.如果挂断电话后,没有关闭vmlog进程,则会导致其它AP 无法得到底层的录音资源,从而无法录音. ...
- 【Hibernate】Hibernate系列2之Session详解
Session详解 2.1.概述-一级缓存 2.2.操作session缓存方法 2.3.数据库隔离级别 2.4.持久化状态 2.5.状态转换 2.6.存储过程与触发器
- UML基础:统一建模语言简介
目录 背景知识 用例图 类图 序列图 状态图 活动图 组件图 部署图 结束语 英文原文:UML basics: An introduction to the Unified Modeling Lang ...
- Continuous Subarray Sum
Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your cod ...
- Java for LeetCode 199 Binary Tree Right Side View
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...
- codeforces A. Dima and Continuous Line 解题报告
题目链接:http://codeforces.com/problemset/problem/358/A 题目意思:在横坐标上给出n个不同的点,需要把前一个点跟后一个点(这两个点的顺序是紧挨着的)用一个 ...
- codeforces B. Routine Problem 解题报告
题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...
- 如何关闭ie9烦人的提示信息?
①Q:如何关闭“IE 限制活动内容”的提示? A:去掉“IE 限制活动内容”的提示: 1. 找到IE的“Internet选项”: 2. 选择“高级”选项卡: 3. 在“设置”下,找到子标题“安全”,将 ...