非常好的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. SparkStreaming+Kafa+HBase

    1. 总结一些概念: 安装zookeeper3.4.6 cp zoo_sample.cfg zoo.cfgvim zoo.cfg tickTime=2000initLimit=10syncLimit= ...

  2. instanceof关键字的理解

    instanceof,两个单词组成,instance of,意为, "… 是 …的实例". 本身包含null值的判断.但是有不少人,先来个 obj != null,然后来个 obj ...

  3. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  4. 作业二:分布式版本控制系统Git的安装与使用

    作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 1.下载安装配置用户名和邮箱. (1)下载安装Github配置 ...

  5. 启动jar的方式

    1.windows server 2008 start "srvRegistry" java -jar srvRegistry-1.0-SNAPSHOT.jar --spring. ...

  6. mpvue——页面跳转

    两个页面 两个页面的跳转,只是单纯的A->B这种跳转. 组件 直接使用小程序的组件,navigator,里面还有一些其他的参数,大家可以自行翻阅官方文档 <navigator url=&q ...

  7. 2.1 re 模块

    正则表达式 简单的范围的字符组 字符 量词 字符集 分组 转义字符 flags 方法  .findall() .finditer() .search() .match()  .sub() .subn( ...

  8. Activation HDU - 4089(概率dp)

    After 4 years' waiting, the game "Chinese Paladin 5" finally comes out. Tomato is a crazy ...

  9. gcc __thread关键字

    https://blog.csdn.net/xj178926426/article/details/54345449 EventLoop.cpp __thread EventLoop* t_loopI ...

  10. ubuntu:基本操作;

    1.系统时间与网络时间同步: sudo dpkg-reconfigure tzdata 注: 该博文为扩展型: