这题说的是给了一个长度为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 ;
}

最新文章

  1. 【转】网络编程socket基本API详解
  2. MVC使用内建的Form辅助器方法创建Select元素
  3. FBX
  4. BootCDN和npm
  5. 常用linux命令索引
  6. Ubuntu kill命令用法详解
  7. java之io之file类的常用操作
  8. 简化PHP开发的10个工具
  9. ios消息的交互方式
  10. oracle传输表空间功能测试(含详细过程)
  11. JTextAreaDemo
  12. [河南省ACM省赛-第三届] 房间安排 (nyoj 168)
  13. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web
  14. CREATE DATABASE RoomReservation
  15. 掌握这些回答技术面试题的诀窍,让你offer拿到手软。
  16. Github上怎么修改别人的项目并且提交给原作者!图文并茂!
  17. 从零开始搭建运维体系 - ansible
  18. Peaceful Commission HDU - 1814(输出最小的一组解)
  19. c++11 function_typetraits备忘
  20. 安装ubuntu的坑&amp;RHEL7配置

热门文章

  1. linux--GCC用法
  2. js里面进行位运算时候的注意事项
  3. oracle数据库sql比较日期
  4. Maven 环境变量设置
  5. linux IP 设置
  6. OpenLayers基础知识:
  7. JS-在线运行代码小工具
  8. ELK基础学习
  9. 2.实现官网环境, 搭建HTTP服务器
  10. [算法] N 皇后