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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【尺取或dp】codeforces C. An impassioned circulation of affection

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【尺取或dp】codeforces C. An impassioned circulation of affection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://codeforces.com/contest/814/problem/C

【題意】

給定一個長度為n的字符串s,一共有q個查詢,每個查詢給出一個數字m和一個字符ch,你的操作是可以改變字符串中的某些字母,最多改變m個,問操作后只包含字符ch的連續子序列最長是多少?

【思路】

方法一:

有這么一類問題,需要在給的一組數據中找到不大于某一個上限的“最優連續子序列”

于是就有了這樣一種方法,找這個子序列的過程很像毛毛蟲爬行方式比較流行的叫法是“尺取法”。

有關尺取的練習:

http://blog.csdn.net/acmer_sly/article/details/59524223

http://acm.hdu.edu.cn/showproblem.php?pid=5328

尺取是線性的,所以總的時間復雜度是O(qn).

方法二:
dp,對每個字母預處理,時間復雜度是O(26n^2)。

【Accepted】

1 #include <iostream> 2 #include <stdio.h> 3 #include <cmath> 4 #include <vector> 5 #include <algorithm> 6 #include <set> 7 #include <map> 8 #include <queue> 9 #include <deque> 10 #include <stack> 11 #include <string> 12 #include <bitset> 13 #include <ctime> 14 #include<algorithm> 15 #include<cstring> 16 using namespace std; 17 typedef long long ll; 18 const int maxn=1502; 19 int n,q,m; 20 char s[maxn]; 21 char ch[5]; 22 23 24 int solve(char c) 25 { 26 //雙指針 27 int l=0,r=0; 28 int ans=0; 29 int cnt=0; 30 while(l<n&&r<n) 31 { 32 //右端點不斷往后掃,直到不能再向右 33 while(r<n && (s[r]==c||cnt<m)) 34 { 35 if(s[r]!=c) 36 { 37 cnt++; 38 } 39 r++; 40 } 41 //記下當前l下的解 42 ans=max(ans,r-l); 43 while(l<=r && s[l]==c) 44 { 45 l++; 46 } 47 //找到第一個使cnt-1的l,r才能繼續向右更新 48 l++; 49 cnt--; 50 } 51 return ans; 52 } 53 int main() 54 { 55 while(~scanf("%d",&n)) 56 { 57 scanf("%s",s); 58 scanf("%d",&q); 59 for(int i=0;i<q;i++) 60 { 61 scanf("%d%s",&m,ch); 62 int ans=solve(ch[0]); 63 printf("%d\n",ans); 64 } 65 } 66 return 0; 67 } 尺取 1 #include <iostream> 2 #include <stdio.h> 3 #include <cmath> 4 #include <vector> 5 #include <algorithm> 6 #include <set> 7 #include <map> 8 #include <queue> 9 #include <deque> 10 #include <stack> 11 #include <string> 12 #include <bitset> 13 #include <ctime> 14 #include<algorithm> 15 #include<cstring> 16 using namespace std; 17 typedef long long ll; 18 int n,q,m; 19 const int maxn=1502; 20 char s[maxn]; 21 int dp[maxn][27]; 22 char ch[5]; 23 void Init() 24 { 25 memset(dp,-1,sizeof(dp)); 26 for(int c=0;c<26;c++) 27 { 28 for(int i=0;i<n;i++) 29 { 30 int num=0; 31 for(int k=i;k>=0;k--) 32 { 33 if(s[k]==(char)(c+'a')) 34 { 35 num++; 36 } 37 //替換i-k+1-num個字母達到的子段長度是i-k+1,枚舉所有的子段不斷更新,找到最大值,共n^2個子段。 38 dp[i-k+1-num][c]=max(dp[i-k+1-num][c],i-k+1); 39 } 40 } 41 } 42 } 43 int main() 44 { 45 while(~scanf("%d",&n)) 46 { 47 scanf("%s",s); 48 Init(); 49 scanf("%d",&q); 50 for(int i=0;i<q;i++) 51 { 52 scanf("%d%s",&m,&ch); 53 if(dp[m][ch[0]-'a']==-1) 54 { 55 printf("%d\n",n); 56 } 57 else 58 { 59 printf("%d\n",dp[m][ch[0]-'a']); 60 } 61 } 62 } 63 return 0; 64 } dp

?

轉載于:https://www.cnblogs.com/itcsl/p/6963357.html

總結

以上是生活随笔為你收集整理的【尺取或dp】codeforces C. An impassioned circulation of affection的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。