• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

T1

想了一下,自然就出来了。

T2

乍一看,背包板(但是数据范围不对

仔细看,v=3就是从这个方面开始的。物品根据体积分为三类。列举一类,三分之一类,另一类应变,最后O(nlogn)

T3

性质:选点顺序与最后的答案无关

所以我们可以枚举出点击是否被选中,那么O(n)保持当前边(用二进制表示),然后就这样。

(为什么我在考场上只维护了一个点?)

T4

想想就生气。

问题的模块不对。我应该60岁了。

然后给dp加个前缀,优化成A,555。

这个问题最讨厌的就是戒指,所以我们直接把答案的枚举改成男生女生最后见面地点的枚举,比如:

11001100110101 - 11100110011010

先解决一个子问题:假设不是环,但是起始段和结束段不可能是同一类。

这个很好解决。设dp[j][k][l]表示已枚举I男的J女第一段性别为K,当前段性别为l。

单击以查看代码。

for(int I=1;I=a;I)DP[0][0][0]=1;

for(int I=1;I=b;I)DP[0][1][1]=1;

//预处理

for(int k=1;k=AK=I;k){

DP[j][0][0]=DP[I-k][j][0][1];

DP[j][1][0]=DP[I-k][j][1][1];

DP[j][0][0]%=mod;DP[j][1][0]%=mod;

}

for(int k=1;k=bk=j;k){

DP[j][0][1]=DP[j-k][0][0];

DP[j][1][1]=DP[j-k][1][0];

DP[j][0][1]%=mod;DP[j][1][1]%=mod;

}

然后,每个回答序列可以从最后一个男女同学相遇的地方开始,把序列和位置1的位置转过来,例如:

100110011010101(序列A)-11100110011010(序列B) 2(序列A从序列B的位置2开始)

我们已经知道了序列B的解,对于每一个可能的序列B,可以增加k个序列A的可能性(k是第一个连续线段的长度)。

第一个连续线段的长度?

所以我们只需要把

单击(int I=1;I=a;I)DP[0][0][0]=1;

for(int I=1;I=b;I)DP[0][1][1]=1;

换成

单击(int I=1;I=a;I)DP[0][0][0]=I;

for(int I=1;I=b;I)DP[0][1][1]=I;

去做吧。

然后我们优化dp前缀和。

点击代码# include bits/stdc . h

#定义M 1005

#定义mod 100000000

使用命名空间std

int n,m,a,b;

龙龙dp[M][M][2][2],钱[M][M][2][2];

//I男J女已枚举。第一段是K,当前段是l。

int main(){

//freopen('treat.in ',' r ',stdin);

//freopen('treat.out ',' w ',stdout);

scanf('%d%d%d%d ',n,m,a,b);a=min(a,n);b=min(b,m);

for(int I=1;I=a;I)钱[0][0][0]=DP[0][0][0]=I;

for(int I=1;I=b;I)钱[0][1][1]=DP[0][1][1]=I;

for(int I=1;I=n;I)for(int j=1;j=m;j){

//for(int k=1;k=AK=I;k){

//DP[j][0][0]=DP[I-k][j][0][1];

//DP[j][1][0]=DP[I-k][j][1][1];

//DP[j][0][0]%=mod;DP[j][1][0]%=mod;

//}

//for(int k=1;k=bk=j;k){

//DP[j][0][1]=DP[j-k][0][0];

//DP[j][1][1]=DP[j-k][1][0];

//DP[j][0][1]%=mod;DP[j][1][1]%=mod;

//}

DP[j][0][0]=钱[i-1][j][0][1]-(ia?钱[I-a-1][j][0][1]:0);

DP[j][1][0]=钱[i-1][j][1][1]-(ia?钱[I-a-1][j][1][1]:0);

DP[j][0][1]=钱[j-1][0][0]-(jb?钱[j-b-1][0][0]:0);

DP[j][1][1]=钱[j-1][1][0]-(jb?钱[j-b-1][1][0]:0);

for(int k=0;k2;k)for(int l=0;L2;l)

dp[j][k][l]%=mod,dp[j][k][l]=mod,DP[j][k][l]%=mod;

Qian[j][0][0]=(Qian[j-1][0][0]DP[j][0][0])% mod;

Qian[j][1][0]=(Qian[j-1][1][0]DP[j][1][0])% mod;

Qian[j][0][1]=(Qian[I-1][j][0][1]DP[j][0][1])% mod;

[j][1][1]=(钱[I-1][j][1][1]DP[j][1][1])% mod;

//printf(' % d % d % lld % lld % lld % lld \ n ',I,j,dp[j][0][0],dp[j][1][0],dp[j][0][1],dp[j][1],DP[j][1][1]);

}

DP[n][m][0][1]=DP[n][m][1][0];

DP[n][m][0][1]%=mod;

printf('%lld ',DP[n][m][0][1]);

返回0;

}

以后再来研究std的做法。

Link to comment
Share on other sites