锐格系统算法相关练习题

本文详细介绍了使用递归与分治策略解决求最大元素值、排序和棋盘覆盖问题,以及如何通过动态规划求解最长公共子序列、最大学习路径和最少加油次数问题。此外,还讨论了贪心算法的应用,如最优服务次序和最短路径问题,并探讨了回溯法在旅行推销员问题和01背包问题中的应用。
摘要由CSDN通过智能技术生成

递归与分治

題目內容:
求n个元素中的最大元素值,要求用递归与分治策略解决。

输入

第1行:元素个数n

第2行:n个元素的值

输出:

n个元素中的最大元素值

实例:

输入:

8 //元素个数

10 3 9 20 4 83 24 65 //8个具体的元素值

输出:

83 //最大元素值

输入输出说明:
输入
第1行:元素个数n​
第2行:n个元素的值
输出:
n个元素中的最大元素值

#include <stdio.h>
#include <stdlib.h>
int n,a[10];
int solve(int l,int r)
{
   

    if(l==r) return a[l];
    return (solve(l,(l+r)/2)>(solve((l+r)/2+1,r))?solve(l,(l+r)/2):(solve((l+r)/2+1,r)));
}
int main()
            {
   
                scanf("%d",&n);
                int i;
                for(i=0;i<n;i++)
                {
   
                    scanf("%d",&a[i]);
                }
                printf("%d",solve(0,n-1));
                return 0;
            }

題目內容:
给定n个元素组成的序列,利用递归与分治策略对其进行排序。

输入:

第1行:元素个数n

第2行:n个元素值

输出:

排好序的n个元素,元素之间用空格分开。

实例:

输入:

5 //输入元素个数

220 10 30 50 40 //输入5个元素

输出:

10 30 40 50 220 //输出排好序的5个元素

输入输出说明:
输入:
第1行:元素个数n
第2行:n个元素值
输出:
排好序的n个元素,元素之间用空格分开。

#include <stdio.h>
#include <stdlib.h>

void copy(int *a,int *b,int l,int r)
{
   
    int i;
    for(i=l;i<=r;i++)
    a[i]=b[i];
}
void merge(int *a,int *b,int l,int mid,int r)
{
   
    int i=l,j=mid+1,k=l,q;
    while(i<=mid&&j<=r)
    {
   
        if(a[i]<=a[j])
        b[k++]=a[i++];
        else
        b[k++]=a[j++];
    }
    if(i<=mid)
    for(q=i;q<=mid;q++)
    b[k++]=a[q];
    else
    for(q=j;q<=r;q++)
    b[k++]=a[q];
}
void mergesort(int *a,int l,int r)
{
   

    int i,b[100];
    if(l<r)
    {
   

        i=(l+r)/2;
        mergesort(a,l,i);
        mergesort(a,i+1,r);
        merge(a,b,l,i,r);
        copy(a,b,l,r);
    }
}
int main()
{
   
    int n,a[100],i;
   scanf("%d",&n);
    
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        mergesort(a,1,n);
        for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    
    return 0;
}

題目內容:
在一个2k*2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一个特殊方格,且称该棋盘为一个特殊棋盘。在棋盘覆盖问题中,要用4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

image.png image.png

输入:棋盘行数,特殊方格的行坐标,特殊方格的列坐标

输出:填完之后的棋盘状态,对应输出项占两列。

说明:特殊方格位置填写数字0,其它L型骨牌从1开始填写。递归按照左上角,右上角,左小角,右小角的顺序进行。

下面是一个输入,输出实例,第一行是输入,其它行是输出。

image.png

输入输出说明:
输入:棋盘行数,特殊方格的行坐标,特殊方格的列坐标
输出:填完之后的棋盘状态,对应输出项占两列。

#include <stdio.h>
#include <stdlib.h>
 int d[100][100]={
   0};
 int t=0;
 void chess(int a,int b,int a1,int b1,int l)
 {
   
     if(l==1) return;
     t++;
     int t1=t;
     int l1=l/2;
     if(a1<a+l1&&b1<b+l1)
     {
   
         chess(a,b,a1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值