传送门

\(一看肯定是区间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. Netty是如何处理新连接接入事件的?

    更多技术分享可关注我 前言 前面的分析从Netty服务端启动过程入手,一路走到了Netty的心脏——NioEventLoop,又总结了Netty的异步API和设计原理,现在回到Netty服务端本身,看 ...

  2. Python 操作mysql数据库之 SQLAlchemy 案例详解

      前言: 字段声明类型中,最右边的是数据库中对应的字段,我们依然可以使用,其左边的的 SQLAchemy 则是其自身封装的自定义类型. 本篇不会讲太多的理论知识,因为这个实用性更强,所以通篇全部都是 ...

  3. synchronized的锁是针对多线程的

    synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白. Java的synchronized使用方法总结 1. 把synchronized当作函数修饰符时 这也就是同步方法,那这 ...

  4. 【题解】LOJ2462完美的集合(树DP 魔改Lucas)

    [题解]LOJ2462完美的集合(树DP 魔改Lucas) 省选模拟考这个??????????????????? 题目大意: 有一棵树,每个点有两个属性,一个是重量\(w_i\)一个是价值\(v_i\ ...

  5. XML-解析失败原因初步分析

    更多精彩文章请关注公众号『大海的BLOG』 首先放出有问题的代码 之所以直入主题是因为肝完了事情,急需入睡.hiahia hiboard:updateUrl="https://xxx.com ...

  6. Windows环境下搭建Cocos2d-x3.2环境并配置android交叉编译环境

    一.软件 1)VS2012(C++11特性在VS2012以上可以使用):传送门: 2)Cocos2d-x官网源码:传送门:http://cocos2d-x.org/download 3)JDK:传送门 ...

  7. tensorflow1.0 lstm学习曲线

    import tensorflow as tf import numpy as np import matplotlib.pyplot as plt BATCH_START = 0 TIME_STEP ...

  8. Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!

    目录 前言 PostgreSql VS MySql HikariCP VS Druid Swagger2 自定义参数配置一览 结语 前言   最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布 ...

  9. Flutter Weekly Issue 53

    插件 left-scroll-actions A useful left scroll actions widget like WeChat.一款仿微信效果的 Flutter 左滑菜单插件.现在支持i ...

  10. 1、flink介绍,反压原理

    一.flink介绍  Apache Flink是一个分布式大数据处理引擎,可对有界数据流和无界数据流进行有状态计算. 可部署在各种集群环境,对各种大小的数据规模进行快速计算. 1.1.有界数据流和无界 ...