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; }

    • 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
          @ 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
            @ 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
            上传者