题目描述:
键盘输入一个有序正项数列,以空格作为间隔符。计算该序列中包含的最长等差子序列的长度,输出长度以及序列。
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
来源:CSDN
作者:查立军
链接:https://blog.csdn.net/weixin_43370733/article/details/104009091