1 条题解
-
0
C :
#include<stdio.h> #define max(a,b) (a>b?a:b) #define min(a,b) (a<b?a:b) int n; int a[110],f[110],l[110],ans=99999; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); f[i]=l[i]=1; } for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) if(a[i]>a[j]) f[i]=max(f[j]+1,f[i]); for(int i=2;i<=n;i++) for(int j=1;j<=i-1;j++) if(a[i]>a[j]) l[i]=max(l[j]+1,l[i]); for(int i=1;i<=n;i++) { ans=min(ans,n-f[i]-l[i]+1); } printf("%d",ans); return 0; }
C++ :
#include<iostream> using namespace std; //比较两个数的大小,返回较大的数 int max(int a,int b) { if(a >= b) return a; else return b; } int main(){ int a[101];//用于存放学生身高 int dpa[101];//用于存放学生数从0到n,的最长递增子序列 int dpb[101];//用于存放学生数从n到0,的最长递增子序列 int n;//n各学生 cin>>n; for(int i=0;i<n;i++){ cin>>a[i]; } //初始化dpa dpb for(int i=0;i<n;i++){ dpa[i]=1; dpb[i]=1; } //从左边开始,求以第i个人为终点的,最长升序子序列长度 for(int i=1;i<n;i++){ //遍历i以前的数 for(int j=0;j<i;j++){ //一旦 第i个人的身高比第j个人的身高高 if(a[i]>a[j]){ // dpa[j]:代表到第j个人的最长升序子序列,+1 代表再加上第i个人 dpa[i] = max(dpa[j]+1,dpa[i]); } } } //从右边开始,求以第i个人为终点的,最长升序子序列 for(int i=n - 1;i>=0;i--){ for(int j=n-1; j>i;j--){ if(a[i]>a[j]) dpb[i]=max(dpb[j]+1,dpb[i]); } } int Max=0; //求左边+右边 值最大的队列 则为 最长的合唱队型 人数 for(int i=0;i<n;i++){ Max=max(Max,dpa[i]+dpb[i]-1); } cout<<n-Max<<endl; }
- 1
信息
- ID
- 2214
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者