http://acm.timus.ru/problem.aspx?space=1&num=1745

题目大意:

可以是任意的顺序,在满足括号匹配的情况下,求组合成的字符串长度最长

思路:

先将每一个字符串进行处理,处理时将匹配的去掉 比如说  { )(()(())(} 处理后就变成了 {)(  (}

当然字符串的长度是没有变化的 处理后的字符串假如说 左括号的个数为L 右括号的个数为R

我们必须确定一个正确的顺序,可以让我们从头到尾的逐个决定是否选用当前字符串,而且不影响最优结果

字符串有 L>R,L<R 和 L=R 三种情况,对于L>R的字符串要放在前面 因为每一个这样的字符串都可以使

左括号 — 右括号 的值变大,

而对于 L<R 的情况对应放在最后,L=R的情况放在中间

对于L<R的字符串之间 需要把 R 小的放在前面, 对于L>R的情况 要用对称思想去确定顺序

确定顺序之后,剩下的就DP就可以了

代码:

#include<iostream>
#include<stack>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<cmath> using namespace std; typedef long long ll;
typedef pair<int,int> pp;
const double eps=1e-9;
const int INF=0x3f3f3f3f;
const int N=1002;
const int M=10002;
struct node
{
string s;
int lk,rk;
int index;
}x[N];
int dp[N][M];
int func(const node& a)
{
if(a.lk-a.rk>0) return 1;
if(a.lk-a.rk<0) return -1;
return 0;
}
bool cmp(const node& a,const node& b)
{
int lf=func(a),rf=func(b);
if(lf==1&&rf==1)
return a.rk<b.rk;
if(lf==-1&&rf==-1)
return a.lk>b.lk;
return lf>rf;
}
int main()
{
//freopen("data.in","r",stdin);
int n;
while(cin>>n)
{
for(int i=0;i<n;++i)
{
cin>>x[i].s;
x[i].index=i+1;
stack<char>st;
for(unsigned int j=0;j<x[i].s.size();++j)
{
if(st.empty()||x[i].s[j]=='('||st.top()==')')
{
st.push(x[i].s[j]);
}else
{
st.pop();
}
}
x[i].lk=x[i].rk=0;
while(!st.empty())
{
if(st.top()=='(') ++x[i].lk;
else ++x[i].rk;
st.pop();
}
}
sort(x,x+n,cmp); memset(dp,-1,sizeof(dp));
dp[0][0]=0;
for(int i=0;i<n;++i)
{
for(int j=0;j<M;++j)
if(dp[i][j]!=-1)
{
dp[i+1][j]=max(dp[i+1][j],dp[i][j]);
if(j>=x[i].rk)
dp[i+1][j-x[i].rk+x[i].lk]=max(dp[i+1][j-x[i].rk+x[i].lk],(int)(dp[i][j]+x[i].s.size()));
}
}
vector<int>vt;
int i=n,j=0;
while(i>0)
{
if(dp[i-1][j]==dp[i][j])
i=i-1;
else
{
vt.insert(vt.begin(),i-1);
j=j-x[i-1].lk+x[i-1].rk;i=i-1;
}
}
cout<<dp[n][0]<<" "<<vt.size()<<endl;
for(unsigned int i=0;i<vt.size();++i)
{
if(i>0) cout<<" ";
cout<<x[vt[i]].index;
}
cout<<endl; }
return 0;
}

1745. Yet Another Answer的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  3. Stack Overflow is a question and answer site

    http://stackoverflow.com/ _ Stack Overflow is a question and answer site for professional and enthus ...

  4. SPOJ GSS2 Can you answer these queries II

    Time Limit: 1000MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Description Being a ...

  5. Question and Answer

    1.VS2013使用EntityFrame问题解决办法 解决办法参照博客http://pinter.org/?p=2374 使用到EntityFrame的项目配置文件修改如下: 项目中凡是使用到DbC ...

  6. 转 https://www.zhihu.com/question/27606493/answer/37447829

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:梁川链接:https://www.zhihu.com/question/27606493/answer/37447829来源: ...

  7. hdu 4027 Can you answer these queries?

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Description Proble ...

  8. GSS4 2713. Can you answer these queries IV 线段树

    GSS7 Can you answer these queries IV 题目:给出一个数列,原数列和值不超过1e18,有两种操作: 0 x y:修改区间[x,y]所有数开方后向下调整至最近的整数 1 ...

  9. GSS7 spoj 6779. Can you answer these queries VII 树链剖分+线段树

    GSS7Can you answer these queries VII 给出一棵树,树的节点有权值,有两种操作: 1.询问节点x,y的路径上最大子段和,可以为空 2.把节点x,y的路径上所有节点的权 ...

随机推荐

  1. 一篇说尽Excel常见函数用法

    一篇说尽Excel常见函数用法 Word,PPT,Excel这三个Office软件是职场办公里最常用的三个软件,但是我发现简书上写PPT的教程多,Excel的少,即使有,也是零零散散.因为Excel的 ...

  2. 中文 iOS/Mac 开发博客列表(转)

    转自https://github.com/tangqiaoboy/iOSBlogCN 中文 iOS/Mac 开发博客列表 本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息. 本博客列表 ...

  3. 如何使用xshell远程连接ubuntu

    在Ubuntu上安装ssh就可以使用xshell登录了,安装步骤: 1,sudo apt-get install openssh-server 2,然后启动ssh sudo /etc/init.d/s ...

  4. 前言,学习ios编程(坚持)

    其实,尝尝有人很疑惑,不知道自己要干嘛,看到很多的培训机构,不知道怎么选择但是又想进入软件行业.其实呢学习不一定要靠培训机构,一定要培训,特别是 当人家把自己吹的天花乱坠的时候,然并卵.出来之后,也只 ...

  5. SQL 已有数据的表创建标识列

    针对已有数据的表创建标识列: ,) constraint FID_1 primary key(FID)

  6. es6还欠完善的地方

    const的可变性 const用于声明常量. 什么是常量,声明后的值不可更改. 对于值类型,比如string,number等等.const声明确实有效. const str = "strin ...

  7. MultipeerConnectivity框架,近场通信的基本使用

    Multipeer connectivity是一个使附近设备通过Wi-Fi网络.P2P Wi-Fi以及蓝牙个人局域网进行通信的框架.互相链接的节点可以安全地传递信息.流或是其他文件资源,而不用通过网络 ...

  8. PPTP协议

    PPTP协议 PPTP(Point-to-Point Tunneling Protocol)点对点隧道协议是PPP协议的一种扩展,它将PPP帧封装进IP包中,通过IP网络进行传输.它通过PPTP控制连 ...

  9. CCNA网络基础(一)

    现在我们使用这一个图来讲解网络的基础知识:     现在只看右边那个图,也就是两台主机和一个交换机       PC1 的配置是      IP 172.16.20.2/24   网关没有配     ...

  10. hadoop中遇到的一些问题

    1.验证词统计程序.----无法加载本地库 出现错误: WARN util.NativeCodeLoader: Unable to load native-hadoop library for you ...