zoukankan      html  css  js  c++  java
  • CodeForces 706C Hard problem

    简单$dp$。

    $dp[i][0]$:第$i$个串放置完毕,并且第$i$个串不反转,前$i$个串字典序呈非递减的状态下的最小费用。

    $dp[i][1]$:第$i$个串放置完毕,并且第$i$个串反转,前$i$个串字典序呈非递减的状态下的最小费用。

    那么可以得到以下递推式:

    如果$s[i] > s[i - 1]$,$dpleft[ i ight]left[ 0 ight] = min(dpleft[ i ight]left[ 0 ight],dpleft[ {i - 1} ight][0])$;

    如果$s[i] > s{[i - 1]_{reverse}}$,$dpleft[ i ight]left[ 0 ight] = min(dpleft[ i ight]left[ 0 ight],dpleft[ {i - 1} ight][1])$;

    如果$s{[i]_{reverse}} > s[i - 1]$,$dpleft[ i ight]left[ {1left] { = min(dp} ight[i} ight]left[ {1left] {,dp} ight[i - 1} ight]left[ 0 ight] + cleft[ i ight])$;

    如果$s{[i]_{reverse}} > s{[i - 1]_{reverse}}$,$dpleft[ i ight]left[ {1left] { = min(dp} ight[i} ight]left[ {1left] {,dp} ight[i - 1} ight]left[ 1 ight] + cleft[ i ight])$;

    初始化的时候,令$dp[i][j]=INF$。如果$dp[n][0]$和$dp[n][1]$都是$INF$,那么输出$-1$,否则输出$min(dp[n][0],dp[n][1])$。

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    const double pi=acos(-1.0),eps=1e-8;
    void File()
    {
        freopen("D:\in.txt","r",stdin);
        freopen("D:\out.txt","w",stdout);
    }
    
    const LL INF=1e17;
    const int maxn=100010;
    char s[maxn],t[maxn];
    LL dp[maxn][2],c[maxn];
    int n;
    
    void res()
    {
        int len=strlen(s);
        for(int i=0;i<len/2;i++) swap(s[i],s[len-i-1]);
    }
    
    void ret()
    {
        int len=strlen(t);
        for(int i=0;i<len/2;i++) swap(t[i],t[len-i-1]);
    }
    
    int main()
    {
        scanf("%d",&n); memset(s,0,sizeof s); memset(t,0,sizeof t);
        for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
        for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=INF;
        scanf("%s",s); dp[1][0]=0; dp[1][1]=c[1];
        for(int i=2;i<=n;i++)
        {
            strcpy(t,s); scanf("%s",s);
    
            if(strcmp(s,t)>=0) dp[i][0]=min(dp[i][0],dp[i-1][0]);
            ret(); if(strcmp(s,t)>=0) dp[i][0]=min(dp[i][0],dp[i-1][1]); ret();
    
            res(); if(strcmp(s,t)>=0) dp[i][1]=min(dp[i][1],dp[i-1][0]+c[i]);
            ret(); if(strcmp(s,t)>=0) dp[i][1]=min(dp[i][1],dp[i-1][1]+c[i]);
    
            res(); ret();
        }
        LL ans=min(dp[n][0],dp[n][1]);
        if(ans==INF) printf("-1
    ");
        else printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    详解Office Add-in 清单文件
    在dotnet core web api中支持CORS(跨域访问)
    Office 365 机器人(Bot)开发入门
    人工智能背景下的Office 365现状和发展趋势
    观未见,行不止 —— Power BI 两周年技术和方案交流圆桌会议纪实
    基于Office 365的随需应变业务应用平台
    实战Excel Add-in的三种玩法
    Office Add-in 设计规范与最佳实践
    在Visual Studio Code中开发Office Add-in
    在Visual Studio 中开发Office Add-in
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5810775.html
Copyright © 2011-2022 走看看