[bzoj2213][Poi2011]Difference_动态规划
生活随笔
收集整理的這篇文章主要介紹了
[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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DSP5509项目之用FFT识别钢琴音调
- 下一篇: BZOJ2339: [HNOI2011]