国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

hdu6017

2019-11-06 09:57:24
字體:
供稿:網(wǎng)友

題意: 話的長度為n,語句里的字符不是2就是3。 呃喵的智力非常有限,只有m點。她每次操作可以交換兩個相鄰的字符,然而代價是智力-2。 現(xiàn)在問你,在使得自己智力不降為負(fù)數(shù)的條件下,呃喵最多能使這個字符串中有多少個子串”233”呢? 如”2333”中有一個”233”,”232323”中沒有”233” 1 <= n <= 100, 0 <= m <= 100

題解: 一看到正解是O(n4)的而我是O(n3)的嚇得我趕緊寫一篇題解 首先要發(fā)現(xiàn)兩個性質(zhì) 1、所有的操作方式都能只用前移完成 2、交換后同種字符間的相對順序不會改變 考慮dp,根據(jù)性質(zhì)1轉(zhuǎn)移時可以只用位置i前移得到所有狀態(tài) 最暴力的狀態(tài)是f[i][s][k],表示處理了前i個位置,串長的樣子是s,得到k個233最少交換幾次。 根據(jù)性質(zhì)2,假設(shè)s[i+1]為2,那他最終移動到的位置不會比上一個2要前,所以我們不需要記錄整個串長什么樣子,只需要記錄上一個2出現(xiàn)的位置即可。3也是同理。 那么狀態(tài)就變成了f[i][j1][j2][k],j1和j2分別表示2和3上一次出現(xiàn)位置。再觀察發(fā)現(xiàn)j1和j2必定有一個是i,所以可以省掉一維。 最終狀態(tài)就是f[i][j][k][o1][o2]。表示考慮了前i位,上一個與第i位不同的字符在位置j,匹配出k個233,第i位為o1,第j位為o2最少交換幾次。o1,o2的取值為0,1,2。0表示這是一個2。1表示這是一個3,并且在他后面加一個3可以貢獻(xiàn)答案。2就表示不能貢獻(xiàn)答案的3。 考慮轉(zhuǎn)移,枚舉新加入的位轉(zhuǎn)移到哪個位置很容易,但是O(n4)不穩(wěn)啊。。 觀察一下,發(fā)現(xiàn)枚舉位置轉(zhuǎn)移一個非常辣雞的地方在于,他做了很多重復(fù)的轉(zhuǎn)移,比如: 這里寫圖片描述 枚舉i+1這個2要轉(zhuǎn)移到中間那一段時,轉(zhuǎn)移的狀態(tài)其實都是f[i+1][j1][k+1][2][0]。而且考慮一下把這個2換到前面,破壞一個答案肯定不是最優(yōu)的。所以特殊的轉(zhuǎn)移只有換一次換到位置i。而中間一段同樣的轉(zhuǎn)移,用個數(shù)組記錄,最后掃一遍就好了。 分析一下3的轉(zhuǎn)移,也有類似的浪費(fèi),同樣的方法處理即可。 于是復(fù)雜度就將到O(n3)辣~~ 就是寫起來有點惡心

#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<iostream>#define N 110#define M 35#define inf 999using namespace std;int f[N][N][M][3][3],g[N][M],n,m,ans;char s[N];void upd(int &x,int y){ if(x>y) x=y;}int main(){ int z;scanf("%d",&z); while(z--) { scanf("%d%d",&n,&m);m/=2; scanf("%s",s+1); if(n<3) {
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 布尔津县| 东源县| 彭泽县| 昌图县| 兴宁市| 垫江县| 望奎县| 扎鲁特旗| 新巴尔虎右旗| 乌鲁木齐市| 皮山县| 工布江达县| 怀来县| 蓬安县| 凉城县| 简阳市| 陆川县| 兰坪| 瑞昌市| 长顺县| 洪洞县| 即墨市| 江达县| 北流市| 广水市| 兴国县| 莱芜市| 瑞金市| 交口县| 宣恩县| 双江| 揭阳市| 启东市| 阿克陶县| 达日县| 杭锦旗| 鹤岗市| 齐齐哈尔市| 收藏| 志丹县| 彩票|