uva11404
2024-10-20 08:36:05
这题说的是给了一个长度为n的字符串(1000)求最长回文子序列,并输出当str[i]==ste[j]时dp[i][j]=dp[i+1][i-1]+2 否则 dp[i][j]=Max(dp[j+1][i],dp[j][i-1]) 要强调一下这uva真是强大 每个后面都加一个string都不爆内存太厉害了
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std;
const int maxn =;
struct point{
int len;
string s;
bool operator <(const point &A)const{
return len<A.len||(len==A.len&&s>A.s);
}
}dp[maxn][maxn];
char s1[maxn],s2[maxn];
int main()
{
for(int i=; i<maxn-; ++i)
dp[i][].len=dp[][i].len=,dp[i][].s=dp[][i].s="";
while(scanf("%s",s1+)==){
int n= strlen(s1+);
for(int i=;i<=n; ++i)
dp[i][i].len=,dp[i][i].s=s1[i];
for(int i=; i<=n; ++i){
for(int j=i-; j>=; --j){
dp[j][i].len=;
dp[j][i].s="";
if(s1[i]==s1[j]){
dp[j][i].len=dp[j+][i-].len+;
dp[j][i].s+=s1[j];
dp[j][i].s+=dp[j+][i-].s;
dp[j][i].s+=s1[i];
// if(dp[j][i]<dp[j+1][i]) dp[j][i]=dp[j+1][i];
//if(dp[j][i]<dp[j][i-1]) dp[j][i]=dp[j][i-1];
}else{
if(dp[j+][i]<dp[j][i-])
dp[j][i]=dp[j][i-];
else dp[j][i]=dp[j+][i];
}
}
}
cout<<dp[][n].s<<endl;
} return ;
}
最新文章
- 【转】网络编程socket基本API详解
- MVC使用内建的Form辅助器方法创建Select元素
- FBX
- BootCDN和npm
- 常用linux命令索引
- Ubuntu kill命令用法详解
- java之io之file类的常用操作
- 简化PHP开发的10个工具
- ios消息的交互方式
- oracle传输表空间功能测试(含详细过程)
- JTextAreaDemo
- [河南省ACM省赛-第三届] 房间安排 (nyoj 168)
- [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
- CREATE DATABASE RoomReservation
- 掌握这些回答技术面试题的诀窍,让你offer拿到手软。
- Github上怎么修改别人的项目并且提交给原作者!图文并茂!
- 从零开始搭建运维体系 - ansible
- Peaceful Commission HDU - 1814(输出最小的一组解)
- c++11 function_typetraits备忘
- 安装ubuntu的坑&;RHEL7配置