递归与分治策略

题目一

#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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值