日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[bzoj2213][Poi2011]Difference_动态规划

發(fā)布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [bzoj2213][Poi2011]Difference_动态规划 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Difference bzoj-2213 Poi-2011

題目大意:已知一個長度為n的由小寫字母組成的字符串,求其中連續(xù)的一段,滿足該段中出現(xiàn)最多的字母出現(xiàn)的個數(shù)減去該段中出現(xiàn)最少的字母出現(xiàn)的個數(shù)最大。求這個個數(shù)。

注釋:$1\le n\le 10^6$。


想法:“在線”的dp題。

狀態(tài):$dp[i][j]$表示在當前位置,字母$i$與字母$j$之間的最大差,$dp2[i][j]$表示出現(xiàn)次數(shù)的差。

這樣的話就可以拿來更新答案了。

至于復雜度的的話,因為每次從$i$更新到$i+1$只會更改52個值,所以復雜度是$O(n)$的。

最后,附上丑陋的代碼... ...

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define K 50 using namespace std; int sum[K],f[K][K],g[K][K],c[K][K],h[K][K],d[K][K],ans; char str[1000010]; void update(int a , int b) {if(c[a][b] < sum[b]) ans = max(ans , f[a][b] - g[a][b]);else if(d[a][b] < sum[b]) ans = max(ans , f[a][b] - h[a][b]);if(f[a][b] < g[a][b]){if(c[a][b] < sum[b]) h[a][b] = g[a][b] , d[a][b] = c[a][b];g[a][b] = f[a][b] , c[a][b] = sum[b];}else if(c[a][b] < sum[b] && f[a][b] < h[a][b]) h[a][b] = f[a][b] , d[a][b] = sum[b]; } int main() {int n,t;scanf("%d%s" , &n , str + 1);for(int i=1;i<=n;i++){t=str[i]-'a'; sum[t]++;for(int j=0;j<K;j++)if(t != j) f[t][j]++,update(t,j),f[j][t]--,update(j,t);}printf("%d\n",ans);return 0; }

?小結:挺好的題(好像是lzh的考試題)。

轉(zhuǎn)載于:https://www.cnblogs.com/ShuraK/p/9537221.html

總結

以上是生活随笔為你收集整理的[bzoj2213][Poi2011]Difference_动态规划的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。