5 条题解

  • 1
    @ 2025-4-19 18:12:29

    #include #include #include #include using namespace std; typedef long long LL; const int MAXN = 1e6 + 10; const int INF = 0x3f; int n; int h[MAXN]; int up[MAXN], down[MAXN]; int ans; void dfs(int step,int l,int r){ if(l + r >= ans)return ;//如果已经比最小答案大,剪枝 if(step == n){//遍历到结束 ans = l + r;//保存答案 return ; } int pla = 0; while(pla < l && up[pla] >= h[step]){ pla++; }//求需要防最高高度 int now = up[pla]; up[pla] = h[step]; if(pla < l)dfs(step + 1, l, r); else dfs(step + 1, l + 1, r); up[pla] = now; pla = 0; while(pla < r && down[pla] <= h[step]){ pla++; }//求需要防最低高度 now = down[pla]; down[pla] = h[step]; if(pla < r)dfs(step + 1, l, r); else dfs(step + 1, l, r + 1); down[pla] = now; } int main() { while(cin >> n){ if(n == 0)break; for(int i = 0;i < n; i++){ cin >> h[i]; } ans = n; dfs(0, 0, 0);//找答案 cout << ans << endl; } return 0; }

    • 1
      @ 2022-4-16 16:02:19
      #include<iostream>
      #include<cmath>
      #include<algorithm>
      #include<cstdio>
      using namespace std;
      typedef long long LL;
      const int MAXN = 1e6 + 10;
      const int INF = 0x3f;
      int n;
      int h[MAXN];
      int up[MAXN], down[MAXN];
      int ans;
      void dfs(int step,int l,int r){
      	if(l + r >= ans)return ;//如果已经比最小答案大,剪枝
      	if(step == n){//遍历到结束
      		ans = l + r;//保存答案
      		return ;
      	}
      	int pla = 0;
      	while(pla < l && up[pla] >= h[step]){
      		pla++;
      	}//求需要防最高高度
      	int now = up[pla];
      	up[pla] = h[step];
      	if(pla < l)dfs(step + 1, l, r);
      	else dfs(step + 1, l + 1, r);
      	up[pla] = now;
      	pla = 0;
      	while(pla < r && down[pla] <= h[step]){
      		pla++;
      	}//求需要防最低高度
      	now = down[pla];
      	down[pla] = h[step];
      	if(pla < r)dfs(step + 1, l, r);
      	else dfs(step + 1, l, r + 1);
      	down[pla] = now;
      }
      int main()
      {
      	while(cin >> n){
      		if(n == 0)break;
      		for(int i = 0;i < n; i++){
      			cin >> h[i];
      		}
      		ans = n;
      		dfs(0, 0, 0);//找答案
      		cout << ans << endl;
      	}
          return 0;
      }
      
      • 0
        @ 2025-7-27 18:13:09

        #include #include #include #include using namespace std; typedef long long LL; const int MAXN = 1e6 + 10; const int INF = 0x3f; int n; int h[MAXN]; int up[MAXN], down[MAXN]; int ans; void dfs(int step,int l,int r){ if(l + r >= ans)return ;//如果已经比最小答案大,剪枝 if(step == n){//遍历到结束 ans = l + r;//保存答案 return ; } int pla = 0; while(pla < l && up[pla] >= h[step]){ pla++; }//求需要防最高高度 int now = up[pla]; up[pla] = h[step]; if(pla < l)dfs(step + 1, l, r); else dfs(step + 1, l + 1, r); up[pla] = now; pla = 0; while(pla < r && down[pla] <= h[step]){ pla++; }//求需要防最低高度 now = down[pla]; down[pla] = h[step]; if(pla < r)dfs(step + 1, l, r); else dfs(step + 1, l, r + 1); down[pla] = now; } int main() { while(cin >> n){ if(n == 0)break; for(int i = 0;i < n; i++){ cin >> h[i]; } ans = n; dfs(0, 0, 0);//找答案 cout << ans << endl; } return 0; }

        • 0
          @ 2024-6-22 18:10:38
          • 0
            @ 2021-8-7 21:15:24

            C++ :

            #include <iostream>
            #include <cstring>
            #include <algorithm>
            
            using namespace std;
            
            const int N = 55;
            int n;
            int h[N];
            int up[N];
            int down[N];
            
            bool dfs(int depth, int u, int su, int sd)
            {
                if(su + sd > depth) return false;
                if(u == n) return true;
                //枚举属于哪个上升子序列
                bool flag = false;
                for(int i = 1; i <= su; i++)
                {
                    if(up[i] < h[u])
                    {
                        int t = up[i];
                        up[i] = h[u];
                        if(dfs(depth, u + 1, su, sd)) return true;
                        up[i] = t;
                        flag = true;
                        break;
                    }
                }
                
                if(!flag) 
                {
                    up[su + 1] = h[u];
                    if(dfs(depth, u + 1, su + 1, sd)) return true;
                }
                
                flag = false;
                
                for(int i = 1; i <= sd; i++)
                {
                    if(down[i] > h[u])
                    {
                        int t = down[i];
                        down[i] = h[u];
                        if(dfs(depth, u + 1, su, sd)) return true;
                        down[i] = t;
                        
                        flag = true;
                        break;
                    }
                }
                
                if(!flag)
                {
                    down[sd + 1] = h[u];
                    if(dfs(depth, u + 1, su, sd + 1)) return true;
                }
                
                return false;
            }
            
            
            int main()
            {
                while(cin >> n, n)
                {
                    for(int i = 0; i < n; i++) cin >> h[i];
                    
                    int depth = 0;
                    while(!dfs(depth, 0, 0, 0)) depth++;
                    
                    cout << depth << endl;
                }
                
                return 0;
            }
            
            
            • 1

            信息

            ID
            98
            时间
            1000ms
            内存
            128MiB
            难度
            4
            标签
            递交数
            154
            已通过
            68
            上传者