传送门

\(一看肯定是区间DP(因为和和合并石子很相似,都要加n-1次)\)

\(转移方程为(其中he[i][j]是i到j的和)\)

\[dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+he[i][j])
\]

\(问题Ⅰ.如何输出括号\)

\(在转移的时候,我们可以用vis[i][j]来记录i到j合并的断点k,所以可以分别递归i至k和k+1至r\)

void dfs(int l,int r)
{
if(l==r) return;
z[l]++,y[r]++;//记录左右括号
dfs(l,vis[l][r]);
dfs(vis[l][r]+1,r);
}

那求中间和也是一样的道理。

void DFS(int l,int r)
{
if(l==r) return;
DFS(l,vis[l][r]);
DFS(vis[l][r]+1,r);
cout<<he[l][r]<<" ";
}

完整代码

#include <bits/stdc++.h>
using namespace std;
int n,dp[22][22],a[22],he[22][22],vis[22][22];
int z[22],y[22];
void dfs(int l,int r)
{
if(l==r) return;
z[l]++,y[r]++;//记录左右括号
dfs(l,vis[l][r]);
dfs(vis[l][r]+1,r);
}
void DFS(int l,int r)
{
if(l==r) return;
DFS(l,vis[l][r]);
DFS(vis[l][r]+1,r);
cout<<he[l][r]<<" ";
}
int main()
{
cin>>n;
memset(dp,20,sizeof(dp));
for(int i=1;i<=n;i++) cin>>a[i],dp[i][i]=0;
for(int i=1;i<=n;i++)
{
int sumn=0;
for(int j=i;j<=n;j++)
{
sumn+=a[j];
he[i][j]=sumn;
}
}
for(int l=2;l<=n;l++)
for(int i=1;i+l-1<=n;i++)
{
int j=i+l-1;
for(int k=i;k<=j-1;k++)
{
if(dp[i][j]>=dp[i][k]+dp[k+1][j]+he[i][j])
{
dp[i][j]=dp[i][k]+dp[k+1][j]+he[i][j];
vis[i][j]=k;//在k点分割的
}
}
}
dfs(1,n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=z[i];j++) cout<<"(";
cout<<a[i];
for(int j=1;j<=y[i];j++) cout<<")";
if(i!=n) cout<<"+";
}
cout<<endl;
cout<<dp[1][n]<<endl;
DFS(1,n);
}

P2308 添加括号(dfs记录dp路径)的更多相关文章

  1. P2308 添加括号(区间DP)

    题目背景 给定一个正整数序列a(1),a(2),...,a(n),(1<=n<=20) 不改变序列中每个元素在序列中的位置,把它们相加,并用括号记每次加法所得的和,称为中间和. 例如: 给 ...

  2. P2308 添加括号

    P2308 添加括号 题解 一看这题---我能AC 看完这题---我要换题 这题第二问其实就是一个链的石子合并,也就是不用处理环 所以一三问怎么处理??? 数组 mid[ i ][ j ] 记录区间 ...

  3. 哈密顿绕行世界问题(dfs+记录路径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...

  4. BFS和DFS记录路径

    DFS记录路径的意义好像不大,因为不一定是最短的,但是实现起来却很简单. #include<math.h> #include<stdio.h> #include<queu ...

  5. 历届试题 危险系数-(dfs+记录路径)

     历届试题 危险系数   问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我 ...

  6. DP+路径 URAL 1029 Ministry

    题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...

  7. vijosP1038 添加括号

    vijosP1038 添加括号 链接:https://vijos.org/p/1038 [思路] 区间DP. 本题的关键在于如何输出解.对于求和表达式而言可以用一个p[][]记录决策然后递归输出,对于 ...

  8. P1291-添加括号(区间dp)

    题目背景 给定一个正整数序列a(1),a(2),...,a(n),(1<=n<=20) 不改变序列中每个元素在序列中的位置,把它们相加,并用括号记每次加法所得的和,称为中间和. 例如: 给 ...

  9. luogu 2308添加括号

    添加括号 传送门 题目大意 现在要添上n-1对括号,加法运算依括号顺序进行,得到n-1个中间和,求出使中间和之和最小的添括号方法. 这道题其实是一个很简单的区间dp,中间和的意思是括号里面的和,也就是 ...

随机推荐

  1. iOS线程数量监控工具

    简单却强大的线程监控工具 KKThreadMonitor :当线程过多或瞬间创建大量子线程(线程爆炸),控制台就打印出所有的线程堆栈.便于分析造成子线程过多或线程爆炸的原因. /******* 线程爆 ...

  2. CVE-2019-17671:wrodpress 未授权访问漏洞-复现

    0x00 WordPress简介 WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务 ...

  3. SpringCloud系列之网关(Gateway)应用篇

    @ 目录 前言 项目版本 网关访问 鉴权配置 限流配置 前言 由于项目采用了微服务架构,业务功能都在相应各自的模块中,每个业务模块都是以独立的项目运行着,对外提供各自的服务接口,如没有类似网关之类组件 ...

  4. Sprint 5 summary: UI 界面更新,Azure端部署和用户反馈分析 12/28/2015

    本次sprint主要完成的任务有对手机APP的UI界面的更新,同时对Azure客户端的部署进行了相应的学习和有关的程序设计.同时对于ALPHA release的用户反馈做出相应的分析以确定接下来工作的 ...

  5. 你自学半年也搞不懂的go底层,看这篇。这篇讲 go的数组、切片、Maps

    目录 数组 1.定义数组 2.使用数组 3.定义并赋值 4.数组的大小是类型的一部分 5.数组是值类型(当参数传递到函数中,修改不会改变原来的值) 6.数组长度 7.循环数组 8.多维数组 切片 1. ...

  6. Spark SQL源码解析(二)Antlr4解析Sql并生成树

    Spark SQL原理解析前言: Spark SQL源码剖析(一)SQL解析框架Catalyst流程概述 这一次要开始真正介绍Spark解析SQL的流程,首先是从Sql Parse阶段开始,简单点说, ...

  7. 解决报错:JPA-style positional param was not an integral ordinal;

    org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...

  8. Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节

    简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...

  9. 21.SpringCloud实战项目-后台题目类型功能(网关、跨域、路由问题一文搞定)

    SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...

  10. jQuery(*****)

    参考1 参考2 1. jQuery 1. 选择器 $("") 1. 基本选择器 1. ID --> $("#d1") 2. 标签名 --> $(&q ...