1264:【例9.8】合唱队形
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=105; 5 6 int a[N],b[N],c[N]; 7 int main(){ 8 int n,t,maxx=0; 9 cin>>n; 10 for(int i=1;i<=n;i++) 11 scanf("%d",&a[i]); 12 for(int i=1;i<=n;i++){ 13 b[i]=1; 14 for(int j=i-1;j>0;j--) 15 if(a[i]>a[j])b[i]=max(b[i],b[j]+1); 16 } 17 for(int i=n;i>0;i--){ 18 c[i]=1; 19 for(int j=i+1;j<=n;j++) 20 if(a[i]>a[j])c[i]=max(c[i],c[j]+1); 21 } 22 for(int i=1;i<=n;i++)maxx=max(maxx,b[i]+c[i]); 23 printf("%d",n-maxx+1); 24 return 0; 25 }
无参考价值,只拿了30分,只是不知道错误原因,所以贴在这。
更新:错误原因应该在于一次遍历不能使得解的子集是最优子集解。
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=105; 5 6 int a[N],b[N],f[N]; 7 int main(){ 8 int n,t,maxx=0; 9 cin>>n; 10 for(int i=1;i<=n;i++) 11 scanf("%d",&a[i]); 12 for(int i=1;i<=n;i++){ 13 f[i]=1; 14 for(int j=i-1;j>0;j--){ 15 if(f[j]+1==f[i]&&a[i]>a[j]&&!b[j]&&b[i])b[i]=0; 16 if(f[j]+1>f[i]&&a[i]!=a[j]){ 17 if(a[i]>a[j]&&b[j])continue; 18 if(a[i]<a[j])b[i]=1; 19 f[i]=f[j]+1; 20 } 21 } 22 maxx=max(maxx,f[i]); 23 } 24 printf("%d",n-maxx); 25 return 0; 26 }