博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
topcoder srm 709 div1
阅读量:6071 次
发布时间:2019-06-20

本文共 2851 字,大约阅读时间需要 9 分钟。

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

int X=0;for(int i=0;i

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

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;int f[1<<15][1<<6];class Xscoregame{public: int getscore(vector
a) { const int n=(int)a.size(); memset(f,-1,sizeof(f)); f[0][0]=0; for(int i=0;i<(1<

  

 

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 
#include
#include
#include
#include
#include
#include
#include
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
get(const int id,const int L,const int spos,const string& S,const vector
&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
nMax) { nMax=j; ans1=i; } if(j==(int)t.size()) ++ans0; } } } return {ans0,ans1,nMax};}class Softmatch{public: int count(string S,vector
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
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

  

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

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

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;int Mask[1<<25];class ColorfulParentheses{ vector
c; int n; int mp[55],nId; vector
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<
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

  

转载于:https://www.cnblogs.com/jianglangcaijin/p/6446547.html

你可能感兴趣的文章
多文件上传
查看>>
linux网络
查看>>
一、安装APACHE
查看>>
我的友情链接
查看>>
linux中用shell获取昨天、明天或多天前的日期
查看>>
多自治系统之间MPLS ××× 实施详解
查看>>
ruby tk尝试
查看>>
WCF服务发布到IIS中去(VS2013+win7系统)
查看>>
【Intellij IDEA】eclipse项目导入
查看>>
phpStudy开发环境 PHPStorm下XDebug配置
查看>>
windows 8.1 windows 10 自动应答文件的创建
查看>>
打字效果
查看>>
Cocos2d-x CCEditBox 编辑框
查看>>
[转载] 中华典故故事(孙刚)——23 打破砂锅问到底
查看>>
Go方法
查看>>
ORA-01012: not logged on
查看>>
经验分享: 成功通过AWS Advanced Networking Specialty认证考试
查看>>
linux MySQL安装
查看>>
java 中文繁简体转换工具 opencc4j
查看>>
html本地数据库—存储功能
查看>>