首页
诗词
字典
板报
句子
名言
友答
励志
学校
网站地图
编程
C++
C语言
C++ Builder
VB
PB
Ruby Rails
perl python
编程
其他开发语言
VBA
VC/MFC
当前位置:
首页
>
教程频道
>
开发语言
>
编程
>
POJ 1458例题
2012-07-28
POJ 1458题解这是一道更为典型的LCS题目,不同与以往的解法,我们不用DP来做,直接用转换为LIS的思路来做。题
POJ 1458题解
这是一道更为典型的LCS题目,不同与以往的解法,我们不用DP来做,直接用转换为LIS的思路来做。
题目:
http://poj.org/problem?id=1458
代码:
#include <iostream>#include <cstdlib>#include <cstdio>#include <vector>using namespace std;int n;string str;vector<int> v1;vector<int> v2;//二分法求最长单调递增子序列关键字下标(<)int binarySearch4(int key,int lowIndex,int highIndex){ if (lowIndex==highIndex) { if (v2[lowIndex] == key) { return lowIndex; } else if (lowIndex == 0 && key<v2[0]) { return lowIndex; } return lowIndex+1; } int midIndex = (lowIndex + highIndex + 1)/2; if (key<v2[midIndex]) { return binarySearch4(key,lowIndex,midIndex-1); } else { return binarySearch4(key,midIndex,highIndex); }}int countTotal(){ int lowIndex = 0; v2.push_back(v1[0]); //将第一个序列的元素在第二个序列的出现位置从大到小,从左到右排列起来 for (int i=1;i<v1.size();i++) { lowIndex = binarySearch4(v1[i],0,v2.size()-1); if (lowIndex>v2.size()-1) { v2.push_back(v1[i]); } else { v2[lowIndex] = v1[i]; } } if (v2[v2.size()-1]==0) { return v2.size()-1; } else { return v2.size(); }}int main(){ cin>>n>>str; for (int i=0;i<str.length();i++) { for (int j=0;j<str.length();j++) { if (str[i] == str[j]) { v1.push_back(str.length()-j); } } } if (v1.size()==0) { cout<<"0"<<endl; } else { cout<<n-countTotal()<<endl; } /*for (int i=0;i<v1.size();i++) { cout<<v1[i]; } cout<<endl;*/ return 0;}
查看更多
下一篇
本文网址:
https://www.reader8.net/jiaocheng/20120728/1939029.html
读书人精选
热点排行
maven 项目平添Maven Dependencies Libr
java类静态域、块,非静态域、块,结构函
Golang的slice圈套
Spring2 兑现AOP编程的两种实现方法
树的底层实现(下)
多线程程序的评量基准
struts2札记之第七讲
jquery 用ID取某个元素上的某个ID元素
java方式之 桥接模式Briage
八、组合模式