zoukankan      html  css  js  c++  java
  • 看错题系列 cf622C C2. Skyscrapers (hard version)

    看错题系列 cf622C C2. Skyscrapers (hard version)

    看成了 对于所有的i不能满足a[i-1]>a[i]&&a[i]<a[i+1]了,血崩

    写了个dp

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 5e5+7;
    int n,m[maxn];
    long long ans,dp[maxn][5][3];
    pair<int,pair<int,int> >from[maxn][5][3];
    int getval(int pos,int p){
        int z=pos+p;
        if(z<1)return -1;
        if(z>n)return -1;
        return min(m[z],m[pos]);
    }
    int getlevel(int x,int y){
        if(x<y)return 0;
        if(x==y)return 1;
        return 2;
    }
    int main(){
        cin>>n;
        n+=2;
        for(int i=3;i<=n;i++){
            cin>>m[i];
        }
        for(int i=3;i<=n;i++){
            for(int j=-2;j<=2;j++){
                for(int k=-2;k<=2;k++){
                    for(int z=-2;z<=2;z++){
                        int a1=getval(i-2,j);
                        int a2=getval(i-1,k);
                        int a3=getval(i,z);
                        if(a1==-1||a2==-1||a3==-1||(a1>a2&&a3>a2))continue;
                        if(a2<=a1){
                            if(dp[i][z+2][getlevel(a3,a2)]<dp[i-2][j+2][0]+a3+a2){
                                from[i][z+2][getlevel(a3,a2)]={k+2,{j+2,0}};
                                dp[i][z+2][getlevel(a3,a2)]=max(dp[i][z+2][getlevel(a3,a2)],dp[i-2][j+2][0]+a3+a2);
                            }
                        }
                        if(dp[i][z+2][getlevel(a3,a2)]<dp[i-2][j+2][1]+a3+a2){
                            from[i][z+2][getlevel(a3,a2)]={k+2,{j+2,1}};
                            dp[i][z+2][getlevel(a3,a2)]=max(dp[i][z+2][getlevel(a3,a2)],dp[i-2][j+2][1]+a3+a2);
                        }
                        if(dp[i][z+2][getlevel(a3,a2)]<dp[i-2][j+2][2]+a3+a2){
                            from[i][z+2][getlevel(a3,a2)]={k+2,{j+2,2}};
                            dp[i][z+2][getlevel(a3,a2)]=max(dp[i][z+2][getlevel(a3,a2)],dp[i-2][j+2][2]+a3+a2);
                        }
                    }
                }
            }
        }
        pair<int,int> now;
        for(int i=0;i<5;i++){
            for(int j=0;j<3;j++){
                if(ans<dp[n][i][j]){
                    ans=dp[n][i][j];
                    now={i,j};
                }
            }
        }
        vector<int>Ans;
        int idx=n;
        while(idx>=3){
            Ans.push_back(getval(idx,now.first-2));
            if(idx-1>=3){
                Ans.push_back(getval(idx-1,from[idx][now.first][now.second].first-2));
            }
            now=from[idx][now.first][now.second].second;
            idx-=2;
        }
        for(int i=Ans.size()-1;i>=0;i--){
            cout<<Ans[i]<<" ";
        }
        cout<<endl;
    }
  • 相关阅读:
    简单所以不要忽视,关于 和 程序员应了解的实际应用
    即使用ADO.NET,也要轻量级动态生成更新SQL,比Ormlite性能更高
    即使用ADO.NET,也要轻量级实体映射,比Dapper和Ormlite均快
    如何在前端实现语义缩放(第一步)
    react教程 — 性能优化
    react教程 — 组件
    react教程 — redux
    create-react-app 创建项目 及 配置
    CSS 预处理器
    react 和 vue 对比
  • 原文地址:https://www.cnblogs.com/qscqesze/p/12355197.html
Copyright © 2011-2022 走看看