1 给定一个长度为n的整数数组A,重排列数组A使得下面计算出的X最大:(n不大于15,A中的大于等于0小于等于50)

int X=0;
for(int i=0;i<n;++i) X=X+(X^A[i]);

 思路:因为抑或只用到了X的后6位,所以令f[i][j]表示已经使用的数字集合为i,得到的当前的X的后6位为j的X的最大值。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <string.h>
#include <set>
using namespace std; int f[1<<15][1<<6]; class Xscoregame
{
public:
int getscore(vector <int> a)
{
const int n=(int)a.size();
memset(f,-1,sizeof(f));
f[0][0]=0;
for(int i=0;i<(1<<n);++i) for(int k=0;k<(1<<6);++k)
{
const int X=f[i][k];
if(X==-1) continue; for(int j=0;j<n;++j) if(!(i&(1<<j)))
{
int y=X+(X^a[j]);
int ni=i|(1<<j);
int nk=y&63;
if(f[ni][nk]<y)
{
f[ni][nk]=y;
}
}
}
int ans=0;
for(int i=0;i<(1<<6);++i)
{
ans=max(ans,f[(1<<n)-1][i]);
}
return ans;
}
};

  

2 给定一个只包含小写a和b的主串S和K个只包含数字0,1,2,3的模式串。可以将主串中的a变成A,b变成B。其中,a可以匹配0,1,A可以匹配2,3,b可以匹配0,2,B可以匹配1,3。对于S中一个位置p和某个模式串i,f(p,i)=1当且仅当S从p开始可以完全匹配模式串i,否则f(p,i)=0。S经过一些位置的改变使得$\sum_{p=0}^{|S|-1}\sum_{i=0}^{K-1}f(p,i)$最大。其中K不大于5,S大小不大于50。

思路:记f[i][j][k]表示到S的第i个位置,能够匹配的最长的是第j个模式串,匹配的长度是k。因为可以从二元组(j,k)中确定S从i开始前面这一段所有的位置的信息,那么下一次就可以接着找出能匹配的最长的。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <string.h>
#include <set>
using namespace std; int f[55][5][55]; int check(char x,char y)
{
if(x=='a') return y=='0'||y=='1';
if(x=='A') return y=='2'||y=='3';
if(x=='b') return y=='0'||y=='2';
return y=='1'||y=='3';
} void up(int &x,int y)
{
if(y>x) x=y;
} char get(char x,char y)
{
if(x=='a')
{
if(y=='0'||y=='1') return 'a';
return 'A';
}
else
{
if(y=='0'||y=='2') return 'b';
return 'B';
}
} vector<int> get(const int id,const int L,const int spos,const string& S,const vector<string> &a,const int tag)
{
int ans0=0,ans1=0;
int nMax=0;
string tmp="";
for(int i=1;i<=L;++i)
{
tmp+=get(S[spos-(L+1-i)],a[id][i-1]);
}
tmp+=tag?S[spos]-'a'+'A':S[spos]; for(int i=0;i<(int)a.size();++i)
{
string t=a[i];
for(int j=1;j<=(int)t.size()&&j<=(int)tmp.size();++j)
{
int ok=1;
for(int x=0;x<j;++x)
{
if(!check(tmp[tmp.size()-(j-x)],t[x]))
{
ok=0; break;
}
}
if(ok)
{
if(j>nMax)
{
nMax=j;
ans1=i;
}
if(j==(int)t.size()) ++ans0;
}
}
}
return {ans0,ans1,nMax}; } class Softmatch
{
public:
int count(string S,vector<string> a)
{
const int N=(int)S.size();
const int M=(int)a.size();
memset(f,-1,sizeof(f)); int cnt0=0,cnt1=0; for(int i=0;i<M;++i)
{
if(a[i].size()==1&&check(S[0],a[i][0])) ++cnt0;
if(a[i].size()==1&&check(S[0]-'a'+'A',a[i][0])) ++cnt1;
} for(int i=0;i<M;++i)
{
if(check(S[0],a[i][0]))
{
if(a[i].size()==1) f[0][i][1]=cnt0;
else f[0][i][1]=0;
}
else if(check(S[0]-'a'+'A',a[i][0]))
{
if(a[i].size()==1) f[0][i][1]=cnt1;
else f[0][i][1]=0;
}
else f[0][i][0]=0;
}
for(int i=1;i<N;++i)
{
for(int j=0;j<M;++j) for(int k=0;k<=(int)a[j].size();++k)
{
if(f[i-1][j][k]==-1) continue;
for(int p=0;p<2;++p)
{
vector<int> t=get(j,k,i,S,a,p);
up(f[i][t[1]][t[2]],f[i-1][j][k]+t[0]);
}
}
}
int ans=0;
for(int i=0;i<M;++i) for(int j=0;j<=(int)a[i].size();++j)
{
up(ans,f[N-1][i][j]);
}
return ans;
}
};

  

3 给定一个长度为n的整数数组A(n不大于50且n为偶数)。构造出一个只包含左右圆括号的长度为n的字符串S,使得字符串满足(1)左右括号匹配;(2)对于任意两个位置i,j,若A[i]=A[j],那么必须S[i]=S[j]。问这样的字符串有多少个。

思路:将字符串分成左右两部分。总的思路是,最后左边剩余的左括号等于右边剩余的右括号数。所以对于那么只在左半部分或者右半部分的数字可以随意指定它是左括号还是右括号;对于那些在两边都出现的数字,左边的这些数字出现为左括号的在右半部分必须为右括号。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <string.h>
#include <set>
using namespace std; int Mask[1<<25]; class ColorfulParentheses
{
vector<int> c;
int n;
int mp[55],nId;
vector<int> S[2][26]; void dfs(int dep,int num,int tag,long long open,long long close)
{
if(dep==n)
{
S[tag][num].push_back(open&((1ll<<nId)-1));
return;
}
if(tag)
{
int t=mp[c[dep]];
if(!(close&(1ll<<t))) dfs(dep+1,num+1,tag,open|1ll<<t,close);
if(num&&!(open&(1ll<<t))) dfs(dep+1,num-1,tag,open,close|(1ll<<t));
}
else
{
int t=mp[c[n*2-1-dep]];
if(!(open&(1ll<<t))) dfs(dep+1,num+1,tag,open,close|1ll<<t);
if(num&&!(close&(1ll<<t))) dfs(dep+1,num-1,tag,open|1ll<<t,close);
}
} public:
long long count(vector<int> color)
{
c=color;
n=(int)c.size()>>1;
nId=0;
int L[55],R[55];
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
for(int i=0;i<n;++i) ++L[c[i]],++R[c[i+n]];
for(int i=0;i<n;++i)
{
if(L[c[i]]&&R[c[i]]) mp[c[i]]=nId++;
}
for(int i=0,t0=0,t1=0;i<n;++i)
{
if(L[c[i]]&&0==R[c[i]]) mp[c[i]]=nId+(t0++);
if(0==L[c[i+n]]&&R[c[i+n]]) mp[c[i+n]]=nId+(t1++);
}
dfs(0,0,0,0,0);
dfs(0,0,1,0,0);
long long ans=0;
for(int i=0;i<=n;++i)
{
for(int j=0;j<(int)S[0][i].size();++j) ++Mask[S[0][i][j]];
for(int j=0;j<(int)S[1][i].size();++j) ans+=Mask[S[1][i][j]];
for(int j=0;j<(int)S[0][i].size();++j) --Mask[S[0][i][j]];
}
return ans;
}
};

  

topcoder srm 709 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. ecshop 前台分页

    在当前需要分页的if最后div里面加入这句, <!-- #BeginLibraryItem "/library/pages.lbi" --><!-- #EndLi ...

  2. sqli-labs(三)

    第五关:这关的重点是有联合查询的注入漏洞,但是页面不会显示查询信息,但是会有报错信息显示在页面上 这关是双查询注入,其实用报错注入和盲注都是可以注入的,但是我觉得这个双查询注入还是很有意思的,所以这关 ...

  3. “0x00,0x08”两个十六进制字符串,转换为整形

    int m_length=0;char buf[2]=={0x00,0x08};memcpy(&m_length,&buf[0],2); m_length=m_length<&l ...

  4. mybatis3 前台传数组 的处理

    /** * 分页按条件查询权限列表 * @param keywords * @return */ @RequestMapping(value = "/getByCondition2" ...

  5. big and little endian

    总是容易搞混big endian 和 little endian,但是找到一篇文章,其解释让人耳目一新. 文章链接:http://www.cs.umd.edu/class/sum2003/cmsc31 ...

  6. idea创建java的web项目

    2. 3. 4. 5. 6. 步骤八: 点击那个倒立的三角形,然后点击Edit Configurations; 步骤八: 步骤九:配置tocat服务器 步骤十:哎,发现,我怎么就只有一个选项呀,art ...

  7. 软工网络15团队作业4——Alpha阶段敏捷冲刺3.0

    软工网络15团队作业4--Alpha阶段敏捷冲刺3.0 1.每天举行站立式会议,提供当天站立式会议照片一张. 2.项目每个成员的昨天进展.存在问题.今天安排. 成员 昨天已完成 今天计划完成 郭炜埕 ...

  8. ASP.NET JSON(转http://www.360doc.com/content/14/0615/21/18155648_386887590.shtml)

    概念介绍还是先简单说说Json的一些例子吧.注意,以下概念是我自己定义的,可以参考.net里面的TYPE的模型设计如果有争议,欢迎提出来探讨!1.最简单:{"total":0} t ...

  9. 互联网级监控系统必备-时序数据库之Influxdb技术

    时间序列数据库,简称时序数据库,Time Series Database,一个全新的领域,最大的特点就是每个条数据都带有Time列. 时序数据库到底能用到什么业务场景,答案是:监控系统. Baidu一 ...

  10. 机器学习评价方法 - Recall & Precision

    刚开始看这方面论文的时候对于各种评价方法特别困惑,还总是记混,不完全统计下,备忘. 关于召回率和精确率,假设二分类问题,正样本为x,负样本为o: 准确率存在的问题是当正负样本数量不均衡的时候: 精心设 ...