CodeForces - 1303E Erase Subsequences(dp)
題目鏈接:點擊查看
題目大意:給出一個字符串 s 和一個字符串 t ,問 t 能否由字符串 s 中兩個不重復(fù)的子序列構(gòu)成
題目分析:一開始以為是貪心去寫,但寫了半天發(fā)現(xiàn)過不去第一個樣例,仔細思考了半天感覺是一個dp就放棄了,賽后看別人的代碼補題,感覺是一個比較經(jīng)典的dp
首先看完這個題目,字符串的長度最長只有400,顯然需要用 n^3 的算法去解決,因為字符串 t 是要由字符串 s 中的兩個子序列構(gòu)成,所以我們很自然的用一層for去枚舉字符串 t 的斷點,將字符串 t 分為兩個子串 t1 和 t2,剩下的我覺得可以貪心,但用dp似乎更簡單一些,最樸素的dp是一個 n^3 的dp,稍微說一下就是 dp[ i ][ j ][ k ] ,代表著字符串 s 到了第 i 位,字符串 t1 到了第 j 位,字符串 t2 到了第 k 位時的狀態(tài)是否存在,最后判斷一下 dp[ len_s ][ len_t1 ][ len_t2 ] 是否為 1 即可,但顯然如果dp是 n^3 的話總復(fù)雜度就到了 n^4 ,我們需要優(yōu)化,因為這個dp的值只有 0 和 1 ,所以我們可以將其降到二維,隨便刪掉一維,令該dp的內(nèi)容變?yōu)檫@一維就好了,我選擇刪去代表字符串 s 的這一維,這樣 dp[ i ][ j ] 就變成了:字符串 t1 到了第 i?位,字符串 t2 到了第 j 位時,在字符串 s 中的最小位置,最后判斷是否成立的條件也是 dp[ len_t1 ][ len_t2 ] 的值是否小于等于 len_s
比較簡單的dp,轉(zhuǎn)移和初始化就不多啰嗦了,直接看代碼吧
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=410;int nx[N][26],dp[N][N];string s,t;void get_next() {int n=s.size();for(int i=0;i<26;i++)nx[n][i]=nx[n+1][i]=n;for(int i=n-1;i>=0;i--){for(int j=0;j<26;j++)nx[i][j]=nx[i+1][j];nx[i][s[i]-'a']=i;} }bool solve(string a,string b) {dp[0][0]=-1;for(int i=0;i<=a.size();i++)for(int j=0;j<=b.size();j++){if(i==0&&j==0)continue;dp[i][j]=s.size();if(i)dp[i][j]=min(dp[i][j],nx[dp[i-1][j]+1][a[i-1]-'a']);if(j)dp[i][j]=min(dp[i][j],nx[dp[i][j-1]+1][b[j-1]-'a']);}return dp[a.size()][b.size()]<s.size(); }bool check() {for(int i=0;i<t.size();i++)//枚舉斷點if(solve(t.substr(0,i),t.substr(i)))return true;return false; }int main() { //#ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); //#endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){cin>>s>>t;get_next();if(check())puts("YES");elseputs("NO");}return 0; }?
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1303E Erase Subsequences(dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1303D F
- 下一篇: CodeForces - 1301D T