非常好的dp,可是我太菜做不出来。。

/*
第i个左括号不可能越过第i+1个左括号
如果第i个左括号到位置j,前提是第i+1个左括号就必须到位置j+1即以后
用dp[i][j]表示把第i个左括号转移到位置j的最大收益,
那么dp[i][j]=将i移到j位置的收益+max(dp[i+1][j+1..n])
这样的复杂度是n^3,一个n的复杂度用来重复计算max(dp[i+1][j+1..n])了
那么就额外开一个数组Max[i][j]:第i个括号转移到第j个位置之后的最大收益
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
#define INF 0x3f3f3f3f
long long val[maxn],dp[maxn][maxn],n,num[maxn],pos[maxn],sum[maxn],t;
char s[maxn];
int main(){
cin>>t;
while(t--){
cin>>n;scanf("%s",s+);
for(int i=;i<=n;i++)cin>>val[i];
int l=,r=;//左括号右括号个数
for(int i=;i<=n;i++)
if(s[i]=='(')
pos[++l]=i,num[l]=r;
else
sum[++r]=sum[r-]+val[i]; memset(dp,,sizeof dp);
for(int i=l;i>=;i--){//第i个左括号
for(int j=n-(l-i);j>=pos[i];j--){
long long tmp=val[pos[i]]*(sum[num[i]+j-pos[i]]-sum[num[i]]);
dp[i][j]=dp[i+][j+]+tmp;
if(j<n-(l-i))dp[i][j]=max(dp[i][j],dp[i][j+]);//把第i个左括号移到位置j及以后的最大收益
}
for(int j=pos[i]-;j>=pos[i-];j--)dp[i][j]=dp[i][j+];
} long long ans=;
for(int i=;i<=n;i++)ans=max(ans,dp[][i]);
cout<<ans<<endl;
}
}

zoj4027 线性dp!好题的更多相关文章

  1. cf478d 线性dp好题

    /* 给定r个红块,g个绿块,按要求堆放 问当堆放成最大高度时,有多少种可能的堆放方式 排列要求:1.第i行放i块 2.每行同色 首先当然要确定能够放置几行 设红块有r个,绿块有g个,那么放置h行需要 ...

  2. poj2018 二分+线性dp好题

    /* 遇到求最值,且答案显然具有单调性,即可用二分答案进行判定 那么本题要求最大的平均数,就可以转换成是否存在一个平均数为mid的段 */ #include<iostream> #incl ...

  3. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  4. 单调队列+线性dp题Watching Fireworks is Fun (CF372C)

    一.Watching Fireworks is Fun(紫题) 题目:一个城镇有n个区域,从左到右1编号为n,每个区域之间距离1个单位距离节日中有m个烟火要放,给定放的地点ai,时间ti当时你在x,那 ...

  5. cf909C 线性dp+滚动数组好题!

    一开始一直以为是区间dp.. /* f下面必须有一个s 其余的s可以和任意f进行匹配 所以用线性dp来做 先预处理一下: fffssfsfs==>3 0 1 1 dp[i][j] 表示第i行缩进 ...

  6. [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题

    题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...

  7. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  8. 动态规划_线性dp

    https://www.cnblogs.com/31415926535x/p/10415694.html 线性dp是很基础的一种动态规划,,经典题和他的变种有很多,比如两个串的LCS,LIS,最大子序 ...

  9. 线性dp

    线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...

随机推荐

  1. wsgi和Django的middleware思维导图

  2. sublime 官方正版,自己用的插件配置,最轻量级安装流程

    到了一家新公司,新的办公电脑,移动工作站哦,配置很酷.需要自己安装编码环境,node.js(http-server)是必须要装的,编辑器个人比较喜欢sublime,现在归纳一下配置流程,ps:本人有点 ...

  3. Lodop某个电脑打印内容大小有问题

    可能原因分析:本地设置放大比例问题,是真实的放大或缩小,1.查看比例应在100%, 2.控制面板设置显示应在100%(win7 win10中) 3.超文本样式问题,分析样式中不同浏览器版本下显示不一致 ...

  4. 【深入Java虚拟机】之三:内存溢出

    为了更直接的了解各区域,下面我们来看几个示例. 1.Java 堆溢出 下面的程中我们限制Java 堆的大小为20MB,不可扩展(将堆的最小值-Xms 参 数与最大值-Xmx 参数设置为一样即可避免堆自 ...

  5. 使用ServletContext对象读取资源文件

    备注:本文以properties文件为例 一.通过ServletContext读取文件 1.通过ServletContext读取放置在src下的properties文件 package com; im ...

  6. edusoho -A5: ApiBundle UML

    edusoho -A5:  ApiBundle UML

  7. opencv 增强现实(一):特征点检测

    import cv2 as cv import numpy as np def draw_keypoints(img, keypoints): for kp in keypoints: x, y = ...

  8. webpack学习记录 - 学习webpack-dev-server(三)

    怎么用最简单的方式搭建一个服务器? 首先安装插件 npm i --save-dev webpack-dev-server 然后修改 packet.json 文件 "scripts" ...

  9. 忘掉Ghost!利用Win10自带功能,玩转系统备份&恢复 -- 关于系统恢复的深度思考

    上一篇文章讲了,系统可以正常启动,如何从D盘恢复系统到C盘的情况. 如果系统不能启动,要怎么去恢复系统,恢复后会是什么结果? 先说明系统结构: 系统版本:Windows 10 (1709) 硬盘1(5 ...

  10. 【最强大的屏幕截图和标注工具】Snagit 2019.1 for Mac

    [简介] 今天和大家分享最新的 Snagit for Mac 2019.1 版本,这是Mac上最好用最强大的屏幕截图工具,Snagit功能非常强大,支持各种方式的屏幕截图,如全屏.滚动.部分.窗口.菜 ...