zoukankan      html  css  js  c++  java
  • ZOJ 4027 Sequence Swapping(DP)题解

    题意:一串括号,每个括号代表一个值,当有相邻括号组成()时,可以交换他们两个并得到他们值的乘积,问你最大能得到多少

    思路:DP题,注定想得掉头发。

    显然一个左括号( 的最远交换距离由他右边的左括号的最终位置决定,那么我们可以从右边开始做。我们用dp[i][j]表示第i个左括号交换到第j个位置后,他和他后面左括号所能得到的最大值。显然,dp[i][j] = i交换得到的值 + 后面左括号产生的最大值。而后面左括号能产生的最大值显然就是max(dp[i+1][k])其中j <= k <= n。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e3 + 10;
    const int INF = 0x3f3f3f3f;
    char s[maxn];
    ll v[maxn], n, Max, pos[maxn], sum[maxn];    ///Max[i]定义为后面的交换到i的最大值
    ll dp[maxn][maxn]; ///第i个放在j位置得到的最大值
    int main(){
        int t, cnt;
        scanf("%d", &t);
        while(t--){
            cnt = 0;
            scanf("%lld", &n);
            scanf("%s", s + 1);
            sum[0] = 0;
            for(int i = 1; i <= n; i++){
                scanf("%lld", &v[i]);
                if(s[i] == ')') sum[i] = sum[i - 1] + v[i];
                else pos[++cnt] = i, sum[i] = sum[i - 1];
            }
            memset(dp, 0, sizeof(dp));
            for(int i = cnt; i >= 1; i--){
                int u = pos[i];
                Max = -INF;
                for(int j = n; j >= u; j--){
                    Max = max(Max, dp[i + 1][j]);
                    dp[i][j] = (sum[j] - sum[u - 1]) * v[u] + Max;
                }
            }
            ll ans = -INF;
            for(int i = 1; i <= n; i++)
                ans = max(ans, dp[1][i]);
            printf("%lld
    ", ans);
        }
        return 0;
    }
  • 相关阅读:
    c语言,浮点数转byte array
    go的select 只会执行一个case,就会退出select 块
    【转】pphp中goto的用法
    [转]php 中yield是个什么东西
    z-index 0 和auto的区别,这个例子好好琢磨一下
    SpringMVC框架下实现原生分页功能
    Jackson 高级应用
    Jackson 的 基本用法
    Jackson转换为Collection、Array
    spring处理数据库中Date类型字段转换成时间戳问题
  • 原文地址:https://www.cnblogs.com/KirinSB/p/10123997.html
Copyright © 2011-2022 走看看