空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述

输入描述:
每组样例第一行为一个整数n,1<=n<=100,第二行为n项的01序列,每一项之间用一个空格隔开。
输出描述:
输出一个正整数,表示最多能展示的项目个数。
输入
4 1 1 0 1 6 0 1 0 0 1 0 1 0
输出
3 4 1
我用了暴力跑每一个1的,对于每一个1,长度为 1之前的0的个数加1之后1的个数
全零的情况也要考虑


#include<iostream> #include<cstring> #include<string> #include<cmath> #include <queue> #include<stack> #include<cstdio> #include<vector> #include<deque> #include<algorithm> #include<iomanip> #define inf 0x3f3f3f3f #define ll long long using namespace std; int a[105]; int main() { int n; while(cin>>n) { int s=0; for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]==0) s++; } for(int i=1;i<=n;i++) { if(a[i]==1) { int s0=0; int s1=0; for(int j=1;j<i;j++) { if(a[j]==0) s0++; } for(int j=i;j<=n;j++) { if(a[j]==1) { s1++; } } if(s1+s0>s) { s=s1+s0; } } } cout<<s<<endl; } return 0; }
结果发现就是求最长不降子序列
#include<iostream> #include<algorithm> #include<iomanip> #include<math.h> #include<string> #include<cstring> using namespace std; int main() { int i,j,n,a[101],dp[101],max=0; while(~scanf("%d",&n)) { int a[101]={0}; for(i=0;i<n;i++) { scanf("%d",&a[i]); dp[i]=1; } for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(a[i]>=a[j]&&dp[j]+1>dp[i]) dp[i]=dp[j]+1; } } max=0; for(i=0;i<n;i++) { if(dp[i]>max) max=dp[i]; } printf("%d\n",max); } }