标签:bre 个数 cout 多少 turn 最大的 阶段 需要 去掉
kuangbin专题十二:I 题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 46186 Accepted Submission(s): 18198
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std ; #define maxn 100000 int n , total ; int num[maxn] ; bool flag ; int num1 ; int main(){ while(~scanf("%d" , &n)){ memset(num , 0 , sizeof(num)) ; total = 0 ; for(int i=1 ; i<=n ; i++){ scanf("%d" , &num1) ; flag = false ; for(int i=0 ; i<total ; i++){ if(num[i] > num1 ){ // 每次 用最小高度 炮 拦截 , 拦截不了就 添加一个炮 flag = true ; num[i] = num1 ; break ; } } if(!flag){ num[total++] = num1 ; } } printf("%d\n" , total) ; } return 0 ; }
动规:
//////////////////////////////// 动态规划 另外: 刚开始以为只要一遍一遍的找最长非递增数列就行了,第一遍找出来最长的,然后把这一列里面的数字去掉, 在剩下来的里面继续前面的操作就行了,直到所有元素都被去掉,然后发现碰到这种情况就不行了 9 5 1 8 4 2 第一次去掉9 5 4 2, 然后去掉1,最后去掉8,就是说要三次,其实只要两次 :第一次9 5 1 , 第二次8 4 2; #include<stdio.h> #include<string.h> // 两个状态 #include<math.h> // dp[i] = max( dp[i] , dp[j] + 1 ); 选 a[i] 和 不选a[i] #include <iostream> #include <algorithm> using namespace std; int N,sum=0; int a[200010],dp[200010]; int main() { while(cin>>N) { // memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); int numbs=0; for(int i=1;i<=N;i++) { cin>>a[i]; } for(int i=1;i<=N;i++) { for(int j=i-1;j>=0;j--) { if(a[i]>a[j]) { dp[i]=max(dp[i],dp[j]+1); // 仔细想想为什么是选 最大的 } } if(numbs<dp[i]) numbs=dp[i]; } cout<<numbs<<endl; } return 0; }
标签:bre 个数 cout 多少 turn 最大的 阶段 需要 去掉
原文地址:http://www.cnblogs.com/yi-ye-zhi-qiu/p/7653489.html