转载自http://hi.baidu.com/bearrice68/item/9c5dc534be099886f5e4ad90
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<string>
using namespace std;
struct STR{
int l,r,d,v,num;
bool q;
}s[1003];
int f[2][10003],ans[10003];
bool last[1003][10003];
map<pair<int,int>,int> l;
bool cmp (STR a,STR b){
if (a.q!=b.q) return a.q>b.q;
else{
if (a.q) return a.r<b.r;
else return a.l>b.l;
}
}
int main(){
std::ios::sync_with_stdio(false);
int i,j,k,m,n,o,p;
string c;
cin >> n;
for (i=1;i<=n;++i){
cin >> c;
for (j=0;j<c.size();++j){
if (c[j]=='(') ++s[i].l;
else{
if (s[i].l==0) ++s[i].r;
else{
--s[i].l;
++s[i].v;
}
}
}
s[i].d=s[i].l-s[i].r;
s[i].q=s[i].d>=0;
s[i].v+=s[i].r;
s[i].num=i;
}
sort(s+1,s+n+1,cmp);
for (i=1;i<=10000;++i) f[0][i]=-1000000000;
for (i=1;i<=n;++i){
o=i&1;
p=o^1;
memcpy(f[o],f[p],sizeof(f[p]));
for (j=s[i].r;j+s[i].d<=10000 && j<=10000;++j)
if (f[o][j+s[i].d]<f[p][j]+s[i].v){
f[o][j+s[i].d]=f[p][j]+s[i].v;
last[i][j+s[i].d]=1;
}
}
for (i=n,j=0;i>0;--i)
if (last[i][j]){
j-=s[i].d;
ans[++ans[0]]=s[i].num;
}
cout << (f[n&1][0]<<1) << ' ' << ans[0] << endl;
for (i=ans[0];i>0;--i)
cout << ans[i] << ' ';
cout << endl;
return 0;
}
代码二:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define zero(x) (fabs(x)<eps)
#define pi acos(-1.0)
#define f1 first
#define f2 second
const int inf=0x3f3f3f3f;
const long long INF=1LL<<50;
using namespace std;
typedef long long LL;
typedef pair <int,double> PII;
#define N 1005
#define M 5005
char str[M<<1];
int n;
int f[N][M];
bool fr[N][M];
int ans[N];
struct node{
int l,r,add,id,ma;
bool q;
bool operator<(const node &oth)const
{ if (q!=oth.q) return q<oth.q;
if (q) return ma-add>oth.ma-oth.add;
else return ma<oth.ma;
}
}a[N];
void doit()
{ for (int i=1;i<=n;i++)
{scanf("%s",str);
int len=strlen(str);
a[i].l=a[i].r=0;
for (int j=0;j<len;j++)
if (str[j]=='(') ++a[i].l;else ++a[i].r;
a[i].add=a[i].r-a[i].l;
a[i].q=a[i].add>=0;
a[i].id=i;
int tmp1=0,tmp2=0;
for (int j=0;j<len;j++)
{ if (str[j]==')') tmp1++;else tmp1--;
tmp2=max(tmp2,tmp1);
}
a[i].ma=tmp2;
}
sort(a+1,a+n+1);
memset(f,222,sizeof(f));
f[0][0]=0;
for (int i=1;i<=n;i++)
for (int j=0;j<M;j++)
{f[i][j]=f[i-1][j];
fr[i][j]=0;
if (j+a[i].add>=a[i].ma&&j+a[i].add>=0&&j+a[i].add<M)
if ( f[i][j]<f[i-1][j+a[i].add]+a[i].r)
{f[i][j]=f[i-1][j+a[i].add]+a[i].r;
fr[i][j]=1;
}
}
memset(ans,0,sizeof(ans));
int j;
for (int i=n,j=0;i>0;i--)
if (fr[i][j])
{ j+=a[i].add;
ans[++ans[0]]=a[i].id;
}
printf("%d %d\n",f[n][0]*2,ans[0]);
bool have=0;
for (int i=ans[0];i>=1;i--)
{ if (have) printf(" "); have=1;
printf("%d",ans[i]);
}
printf("\n");
}
int main()
{ while (scanf("%d",&n)!=EOF) doit();
}
/*
2
(
)
*/