17A_3等差数列问题

时光毁灭记忆、已成空白 提交于 2020-01-17 02:50:36

题目描述:

键盘输入一个有序正项数列,以空格作为间隔符。计算该序列中包含的最长等差子序列的长度,输出长度以及序列。

sample input:

1 2 3 5 7 8 14 20 26

sample output:

5
2 8 14 20 26

测试结果:

在这里插入图片描述

思路:

本题目应该可以用动态规划解,但是没想出来,用的DFS的思路。

AC代码

#include <stdio.h>
#define maxn 100

typedef struct
{
    int a[maxn];
    int len;
}Node;

Node temp,ans;
int test[maxn];
int n;//一共有n个元素
int max=0;

int isAS()//判断是否为等差数列
{
    if(temp.len<=2)return 1;//temp的数组len长度小于等于2时
    if((temp.a[temp.len-1]-temp.a[temp.len-2])==(temp.a[temp.len-2]-temp.a[temp.len-3]))return 1; //temp的数组len长度大于等于3时
    return 0;//其他情况不是
}


void DFS(int index,int flag,int count)
{//限制条件为是flag=1表示等差数列,取优条件为 count>max,
    if(flag==0)return;//不是等差数列就返回
    if(count>max){
        max=count;
        ans=temp;
    }
    if(index<n)
    {
        temp.a[temp.len++]=test[index];
        DFS(index+1,isAS(),count+1);//加入之后在参数中判断是否为等差数列并传递
        temp.len--;
        DFS(index+1,isAS(),count);
    }
}


int main()
{
    n=0;
    do{
        if(scanf("%d",test+n)!=EOF)
            n++;
    }while(getchar()!='\n');
    temp.len=0;//初始化
    DFS(0,isAS(),0);
    printf("%d\n",max);
    for(int i=0;i<ans.len;i++)
    {
        printf("%d ",ans.a[i]);
    }
}


Scanf函数介绍:

来自百度
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
如:

scanf("%d %d",&a,&b);

函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!