P2308 添加括号(dfs记录dp路径)
\(一看肯定是区间DP(因为和和合并石子很相似,都要加n-1次)\)
\(转移方程为(其中he[i][j]是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路径)的更多相关文章
- P2308 添加括号(区间DP)
题目背景 给定一个正整数序列a(1),a(2),...,a(n),(1<=n<=20) 不改变序列中每个元素在序列中的位置,把它们相加,并用括号记每次加法所得的和,称为中间和. 例如: 给 ...
- P2308 添加括号
P2308 添加括号 题解 一看这题---我能AC 看完这题---我要换题 这题第二问其实就是一个链的石子合并,也就是不用处理环 所以一三问怎么处理??? 数组 mid[ i ][ j ] 记录区间 ...
- 哈密顿绕行世界问题(dfs+记录路径)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...
- BFS和DFS记录路径
DFS记录路径的意义好像不大,因为不一定是最短的,但是实现起来却很简单. #include<math.h> #include<stdio.h> #include<queu ...
- 历届试题 危险系数-(dfs+记录路径)
历届试题 危险系数 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系. 我 ...
- DP+路径 URAL 1029 Ministry
题目传送门 /* 题意:就是从上到下,找到最短路,输出路径 DP+路径:状态转移方程:dp[i][j] = min (dp[i-1][j], dp[i][j-1], dp[i][j+1]) + a[[ ...
- vijosP1038 添加括号
vijosP1038 添加括号 链接:https://vijos.org/p/1038 [思路] 区间DP. 本题的关键在于如何输出解.对于求和表达式而言可以用一个p[][]记录决策然后递归输出,对于 ...
- P1291-添加括号(区间dp)
题目背景 给定一个正整数序列a(1),a(2),...,a(n),(1<=n<=20) 不改变序列中每个元素在序列中的位置,把它们相加,并用括号记每次加法所得的和,称为中间和. 例如: 给 ...
- luogu 2308添加括号
添加括号 传送门 题目大意 现在要添上n-1对括号,加法运算依括号顺序进行,得到n-1个中间和,求出使中间和之和最小的添括号方法. 这道题其实是一个很简单的区间dp,中间和的意思是括号里面的和,也就是 ...
随机推荐
- ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点
ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...
- AtomicInteger的并发处理
AtomicInteger的并发处理 博客分类: Effective Java JDK1.5之后的java.util.concurrent.atomic包里,多了一批原子处理类.主要用于在高并发环 ...
- 如何提高你使用windows的逼格(windows用成Linux的赶脚)
一.准备工作 作为一个整洁而有内涵的人,电脑桌面一定要清洁 二.桌面整洁了,软件怎么打开呢? 方案一 方案二.敲重点 我们可以使用终端指令打开windows安装的任意软件: 打开Windo ...
- 2019-07-28【机器学习】无监督学习之聚类 DBSCAN方法及其应用 (在线大学生上网时间分析)
样本: import numpy as np import sklearn.cluster as skc from sklearn import metrics import matplotlib.p ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(六)之Initialization & Cleanup
Two of these safety issues are initialization and cleanup. initialization -> bug cleanup -> ru ...
- mvc传递json数据到view简单实例
基于extjs4.2 controller //存储数据的类 public class DataLink { public string Name { get; set; } public strin ...
- radio取值
假设代码如下: 1) <input type="radio" name="radio" id="radio1" checke ...
- java Int类型转为double 类型;string转double
int a=12; double b=(double)a; or double c=Double.valueOf((double)a); string a_s="12"; doub ...
- python数据结构之栈的构建
class Stack(object): def __init__(self): self.stack=[] def pop(self): return self.stack.pop() def pu ...
- 【mybatis annotation】数据层框架应用--Mybatis(二) 基于注解实现数据的CRUD
使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...