题目一
#include <vector>
#include <string>
#include <iostream>
#include <string.h>
#include <sstream>
using namespace std;
//输出最长公共子串(LCS)
//二维数组veca记录的是两个字符串Xi和Yj的LCS长度
int LCS_length(const string &str1, const string &str2,
vector<vector<int> > &veca, vector<vector<int> > &vecb) {
int i, j;
int biggest = 0;
if (str1 == "" || str2 == "")
return 0;
for (i = 0; i <= str1.length(); i++) {
veca[i][0] = 0;
}
for (j = 0; j <= str2.length(); j++) {
veca[0][j] = 0;
}
for (i = 1; i <= str1.length(); i++) {
for (j = 1; j <= str2.length(); j++) {
//如果Xi-1 == Yj-1,那么最长子序列为veca[i - 1][j - 1] + 1
//此时将vecb[i][j] = 1表明str1[i-1]是子问题LCS的一个元素
if (str1[i - 1] == str2[j - 1]) {
veca[i][j] = veca[i - 1][j - 1] + 1;
vecb[i][j] = 1;
}
else {
if (veca[i - 1][j] >= veca[i][j - 1]) {
veca[i][j] = veca[i - 1][j];
vecb[i][j] = 2;
}
else {
veca[i][j] = veca[i][j-1];
vecb[i][j] = 3;
}
}
}
}
return veca[str1.length()][str2.length()];
}
//该函数用于输出一个LCS的序列
//这里输出的顺序是先向上寻找,再向左寻找
void PrintOneLCS(vector<vector<int> > &vecb, string &str1, int i, int j) {
if (i == 0 || j == 0)
return;
if (vecb[i][j] == 1) {
PrintOneLCS(vecb, str1, i - 1, j - 1);
cout << str1[i - 1] << "";
}
else if (vecb[i][j] == 2)
PrintOneLCS(vecb, str1, i -1, j);
else
PrintOneLCS(vecb, str1, i, j - 1);
}
int main() {
string temp1,temp2;
cin>>temp1>>temp2;
//string input;
//getline(cin, input);
// ss(input);
string str1, str2;
cin >> str1;
cin >> str2;
//将veca初始化为一个二维数组,其行列值分别为str1和str2的长度加1
//二维数组veca记录的是两个字符串Xi和Yj的LCS长度
//二维数组vecb[i][j]记录veca[i][j]时所选择的子问题的最优解
vector<vector<int> > veca(str1.length() + 1, vector<int>(str2.length() + 1));
vector<vector<int> > vecb(str1.length() + 1, vector<int>(str2.length() + 1));
//cout << LCS_length(str1, str2, veca, vecb) << endl;
LCS_length(str1, str2, veca, vecb);
PrintOneLCS(vecb, str1, str1.length(), str2.length());
return 0;
}
题目二
#include <iostream>
using namespace std;
void Merge(int *array, int low, int middle, int high) //合并
{
int *A = new int[high - low + 1]; //临时数组,存储个数为high - low + 1个数据
int i = low;
int j = middle + 1;
int k = 0;
while(i <= middle && j <= high) //直至前半部或后半部数据完全录入暂存
{
if(array[i] < array[j]) //如果前半部的数据小于后半部的,前半部数据暂存
A[k++] = array[i++];
else //否则后半部数据暂存,并下标自加
A[k++] = array[j++];
}
while(i <= middle) //保证前半部数据录入暂存
A[k++] = array[i++];
while(j <= high) //保证后半部数据录入暂存
A[k++] = array[j++];
for(i = low; i <= high; i++) //将暂存的数据重新填充至array[low]--array[high]中
array[i] = A[i - low];
}
void MergeSort(int *array, int low, int high)
{
int middle; //二分
if(low < high)
{
middle = (low + high) / 2; //二分
MergeSort(array, low, middle); //前半部
MergeSort(array, middle + 1, high); //后半部
Merge(array, low, middle, high); //合并
}
}
int main()
{
int n;
cin>>n; //录入需要排列的个数
int *array = new int[n];
for(int i = 0; i < n; i++)
{
cin>>array[i]; //录入未排序的数据
}
MergeSort(array, 0, n - 1); //进行排序
for(int j = 0; j < n; j++) //输出排列结果
{
cout<<array[j]<<" ";
}
cout<<endl;
return 0;
}
题目三
#include <iostream>
using namespace std;
int Max_num(int a_list[],int m,int n)
{
int mid=(m+n)/2;
if(m==n) return a_list[m];
else
{
int max1=Max_num(a_list,m,mid);
int max2=Max_num(a_list,mid+1,n);
return (max1>max2?max1:max2);
}
}
int main()
{
int i,num;
cin>>num;
int a_list[num];
for(i=0;i<num;i++)
{
cin>>a_list[i];
}
cout<<Max_num(a_list,0,num-1);
}