8 25正睿十連測DAY1T3(區間dp)

2021-08-26 15:02:50 字數 1802 閱讀 7499

看上去好像一臉不可做。

稍微想一下就能發現是區間dp

d

p用dp

i,j dpi

,j

表示區間[i

,j] [i,

j]

是否合法

這裡合法的定義為,要麼可以按照題意直接由乙個母串多次插入而來

要麼刪掉一些母串之後剩餘部分正好是原串的字首

那麼我們只要列舉可能的母串即可

母串必須滿足條件le

n母|l

en總 len

母|le

n總

且∀(c=′a

′ ∀(c

=′a′

~′z′)nu

mz總/

numz

子==k ′z′

)num

z總/n

umz子

==k

k為定值

所以我們只要列舉合法子串即可

#include

using

namespace

std;

#define rep(i,j,k) for(int i = j;i <= k;++i)

#define repp(i,j,k) for(int i = j;i >= k;--i)

#define rept(i,x) for(int i = linkk[x];i;i = e[i].n)

#define p pair

#define pil pair

#define pli pair

#define pll pair

#define pb push_back

#define pc putchar

#define mp make_pair

#define file(k) memset(k,0,sizeof(k))

#define ll long long

char s[210];

char s[210];

bool dp[205][205];

int num[210][26];

int n;

bool check;

char ans[210];

mapvis;

void pre()

}bool cmp(int len)

void new(int len)

string x;

void work(int len)

for(int k = 1;k*len <= i;++k)

if(dp[l][r-k*len])

if(dp[r-k*len+1][r])

}if(dp[1][n]) new(len);

}int now[26];

void solve(int len)

if(!tmp) tmp = num[n][i] / now[i];

else

if(num[n][i]/now[i] != tmp)

}else

}if(!flag) continue;

rep(i,1,len) s[i] = s[i+st-1];

work(len);

}if(check)rep(i,1,len) printf("%c",ans[i]);

if(check)printf("\n");

}int main()

else

break;

if(!check) printf("%s\n",s+1);

}return

0;}

正睿 2018 提高組十連測 Day5

鴨血居然沒想到字首和優化dp,主要是寫的是刷表.只想到線段樹優化,還要兩棵.首先是暴力解法 f i j f i 1 k 0 k j 2 嗯.這個顯然可以字首和優化.然後是正常人dp解法 令f i,j 表示長度為i總和為j的合法陣列個數 則f i j f i j 1 f i 1 j 2 第二項只有j為...

2019正睿CSP S模擬賽十連測day8

link to this contest 這場題做的體驗一般,沒有 探索中求進步 的思考快感,會做的直接做,不會做的一點思路都沒有,晚了半個小時開始,提早乙個小時結束操作 t1 轉化以下題意直接模擬,t2 完全不會,去看 t3 看來看去都只會 50 的部分分,感覺也不少了就寫完放棄了,回去把 t2 ...

正睿2020提高組十連測 選做

更新中.目錄題目鏈結 理解題意,打出第乙個暴力 首先需要知道,隨機生成的樹 如果不特別說明隨機方法,就是指在所有 n 棵樹里隨機 最大深度期望是 o sqrt 的。看本題。首先,期望是嚇唬你的,因為期望乘上階乘,其實就是求和。於是我們要求 所有排列下 操作後所有點的權值和 的和 因此暴力做法就是列舉...