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+ ...
随机推荐
- Ubuntu上安装gtk2.0不能安装的问题,“下列的软件包有不能满足的依赖关系”
zez@localhoss:~$ sudo apt-get install libgtk2.0-dev正在读取软件包列表... 完成正在分析软件包的依赖关系树 正在读取状态信息... 完成 ...
- 【OpenStack】OpenStack系列7之Nova详解
源码下载.安装 参考: https://github.com/yongluo2013/osf-openstack-training/blob/master/installation/openstack ...
- ORM框架是什么
ORM框架是什么 对象关系映射,目前数据库是关系型数据库 ORM 主要是把数据库中的关系数据映射称为程序中的对象 目前集中常见的ORM框架1 Nhibernate原因:用的比较多,资料也比较好找. ...
- Flatten Binary Tree to Linked List
Flatten a binary tree to a fake "linked list" in pre-order traversal. Here we use the righ ...
- python动态获取对象的属性和方法
http://blog.csdn.net/kenkywu/article/details/6822220首先通过一个例子来看一下本文中可能用到的对象和相关概念.01 #coding: UTF- ...
- cas单点登录用户名为中文的解决办法
当用户名为中文时,登录后返回的用户名乱码.解决这个问题只需要在客户端的CAS Validation Filter中添加下配置就行了. <init-param> <param-name ...
- Android的Observable和iOS的NotificationCenter
使用起来很类似,参看以下网址http://stackoverflow.com/questions/10327200/equivalent-of-ios-nsnotificationcenter-in- ...
- 51nod 1264 线段相交
题目:传送门. 题意:给两条线段,有一个公共点或有部分重合认为相交,问他们是否相交. 题解:这属于非规范相交的情况,模板题. #include <iostream> #include &l ...
- How to Optimize Battery Health?
1. click on the battery icon from taskbar next to the date and time. 2. click "More power optio ...
- struts1老古董配置
<!--Struts1 struts-config.xml Demo --><?xml version="1.0" encoding="UTF-8&qu ...