最长递增子序列
input:
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
output:
3 4 6 8
错误代码
#include <stdio.h> int main() { int i; int n; scanf("%d",&n); int a[100]; for(i=0;i<n;i++) { scanf("%d",&a[i]); } int j; int count; int max=0; int ini; for(i=0;i<n;i++) { for(j=i;j<n-1;j++) { count=1; // if(a[j]<a[j+1]) { count++; } // if(count>max){ini=i;max=count;} else { break; } } if(count>max){ini=i;max=count;} } printf("%d",a[ini]); for(i=ini+1;i<ini+max;i++) { printf(" %d",a[i]); } }
正确代码
#include <stdio.h> int main() { int n; scanf("%d", &n); int a[100]; for (int i = 0; i < n; i++) { scanf("%d", &a[i]); } int max_len = 1; // 最长连续递增序列长度 int start_idx = 0; // 最长序列的起始索引 int current_len; // 遍历每个可能的起始点 for (int i = 0; i < n; i++) { current_len = 1; // 当前序列长度至少为1 // 向后延伸检查连续递增 for (int j = i + 1; j < n; j++) { if (a[j] > a[j - 1]) { current_len++; } else { break; // 不再递增,停止延伸 } } // 更新最长序列信息 if (current_len > max_len) { max_len = current_len; start_idx = i; } } // 输出结果 printf("%d", a[start_idx]); for (int i = start_idx + 1; i < start_idx + max_len; i++) { printf(" %d", a[i]); } printf("\n"); // 添加换行符 return 0; }
改正的代码
#include <stdio.h> int main() { int i; int n; scanf("%d",&n); int a[100]; for(i=0;i<n;i++) { scanf("%d",&a[i]); } int j; int count; int max=1; int ini=0; for(i=0;i<n;i++) { count=1; // for(j=i;j<n-1;j++) { if(a[j]<a[j+1]) { count++; } // if(count>max){ini=i;max=count;} else { break; } } if(count>max){max=count;ini=i;} } printf("%d",a[ini]); for(i=ini+1;i<ini+max;i++) { printf(" %d",a[i]); } return 0; // }