D - Sequence Swapping

看了一天终于会写了哇咔咔。

题意:给你个长度为n的括号序列,每个括号对应一个数字,每操作你可以选择相邻的左右括号交换它们的位置同时将它们的值相乘,你可以操作任意次,问你它们值相乘的结果的和最大可以是多少啊?

解法:因为每个左括号所能到达最右的位置是固定的,并且左括号与右面的任意一个可以到达的右括号交换,仅仅会影响它们俩者的位置,也就是说,左括号和右括号的相对位置都是不变的。所以我们想对于一个( 来说它可以与它后面相邻的)))这样的序列直接交换,这样可以求它与每个右括号交换位置所能产生的价值然后通过比较找它所能产生的最大贡献,但是它后面如果是))()出现了一个左括号的话,如果它想和第四个位置右括号交换位置那么首先得满足第三个位置的左括号已经和第四个位置的右括号交换了位置,所以,在计算它与第三个右括号交换所能产生的最大价值时,我们可以想到要利用满足第三个位置的左括号已经和第四个位置的右括号交换了位置的这种情况下的最优解去推这个括号能产生的最优解,也就是说,对于每个左括号来说当计算它所能产生的贡献时,需要判断比较它与每个右边括号交换的最大贡献,而计算它与每个右边括号交换的最大贡献时需要考虑他所在右边的所有左括号都已经到了你要交换的这个右边括号的右边位置,所以我们要倒着从右往左来判断每个左括号能产生的最大贡献,又因为,我们在计算每个左括号时都考虑了他右边所有左括号的最优情况,所以最后最左边的左括号得到f[1,j] j从1到n求个最大值就是答案。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL f[1005][1005];
LL a[1005];
LL pres[1005];
int l[1005];
char s[1005];
LL v[1005];
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);scanf("%s",s+1);memset(f,0,sizeof(f));memset(pres,0,sizeof(pres));int q=0;for(int i=1; i<=n; i++){scanf("%lld",&v[i]);if(s[i]=='('){l[++q]=i;pres[i]=pres[i-1];}else pres[i]=pres[i-1]+v[i];}for(int i=q;i>=1;i--){int pos=l[i];LL maxx=f[i+1][n];for(int j=n;j>=pos;j--){maxx=max(f[i+1][j],maxx);f[i][j]=maxx+(pres[j]-pres[pos])*v[pos];                }}LL ans=0;for(int i=1;i<=n;i++)ans=max(ans,f[1][i]);printf("%lld\n",ans);}
}

转载于:https://www.cnblogs.com/dongdong25800/p/10807657.html

D - Sequence Swapping DP相关推荐

  1. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp

    C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  2. HDU 6078 Wavel Sequence (dp)

    Description Have you ever seen the wave? It's a wonderful view of nature. Little Q is attracted to s ...

  3. UVA1626 / ZOJ1463 Brackets sequence 区间DP

    简单区间DP (有空串... ...) Brackets sequence Time Limit: 4500MS   Memory Limit: Unknown   64bit IO Format:  ...

  4. HDOJ-2062 :Subset sequence(DP)

    题目:求子集序列 Consider the aggregate An= { 1, 2, -, n }. For example, A1={1}, A3={1,2,3}. A subset sequen ...

  5. 紫书动规 例题9-10 UVA - 1626 Brackets sequence 区间dp

    题目链接: https://vjudge.net/problem/UVA-1626 题意: 题解: dp[i][j]:= i~j需要最少的括号 区间dp: dp[i][j] = min(dp[i][j ...

  6. [HDOJ3998] Sequence(DP,最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 给数字,问LIS以及每一个数字只取一次,最多能取多少个LIS. LIS直接O(n^2) dp即可 ...

  7. cf13C Sequence(DP)

    题意: N个数.a1...aN. 对于每个数而言,每一步只能加一或减一. 问最少总共需要多少步使得新序列是非递减序列. N (1 ≤ N ≤ 5000) 思路: *一个还不知道怎么证明的结论(待证): ...

  8. HDU 6078 Wavel Sequence(dp)

    Description 定义波浪序列:a1 > a2 < a3-,现在给出一个长度为n的序列a和一个长度为m的序列b,求a和b的公共波浪子序列个数 Input 第一行一整数T表示用例组数, ...

  9. 【XSY2564】sequence(dp)

    题面 [题目描述] 给定一个长度为nnn的由['0'...'9'][\text{'}0\text{'}...\text{'}9\text{'}]['0'...'9']组成的字符串sss,v[i,j]v ...

最新文章

  1. 数据库 sql 语句优化
  2. java 的23种设计模式 单例模式
  3. MongoDB 小试牛刀
  4. org/eclipse/jetty/server/Handler : Unsupported major.minor version 52.0
  5. 小学数学加减法测试软件,儿童数学加法运算火箭(测试版)
  6. 模块化实现(好处,原因)
  7. BlogEngine.Net架构与源代码分析系列索引贴
  8. Idea 里svn的导入使用
  9. char和char*
  10. Mac新手使用技巧——设置Finder(访达)快捷键
  11. OFDM学习笔记(七)(多址接入技术)
  12. 计算机硬盘分区重置,重置计算机磁盘分区后如何恢复丢失的数据
  13. GPS经纬度转百度地图经纬度
  14. VsCode下通过Latex运行计算机学报的模板
  15. C语言单链表讲解(上):有表头链表的使用
  16. 如何学习android
  17. oracle分类账设置,Oracle EBS R12 总帐和子分类账关系详解[转载]
  18. 南京软件测试自学英语,南京软件测试培训班怎么样?南京软件测试培训班学什么?...
  19. 最实用的使用idea看源码的技巧
  20. 2.前端笔记-CSS-字体属性

热门文章

  1. php 内置mail 包,配置php自带的mail功能
  2. javascript--弹出对话框 四种对话框 获得用户输入值 .
  3. Arrays 的copyOf() - JDK 6 和操作符 instanceof
  4. linux mysql dns_Linux下搭建DNS服务器及踩坑
  5. 0x80070659系统策略禁止这个安装 vc_不安装DNS解析服务器下安装Vcenter6.7
  6. java和android 语法区别_病症解析:语言发育迟缓和自闭症的联系与区别
  7. kpmg java_【毕马威(KPMG)工资】java开发工程师待遇-看准网
  8. el-drawer点击的时候为什么有边框_80%人都有的表格强迫症怎么破,一招教你自动添加表格边框...
  9. echarts 树图样式美化_echarts树图tree改为流程图
  10. 安装python的moviepy_MoviePy 安装 配置