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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Loj2687,jzoj3320-文本编辑器【线头dp】

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Loj2687,jzoj3320-文本编辑器【线头dp】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://loj.ac/problem/2687


題目大意

三個操作:

  • hhh光標向前移動一格
  • xxx刪除光標處字母
  • fcf\ cf?c移動到下一個字符ccc(算兩次操作)
  • 然后fff操作不能對字符eee使用,然后求最少操作次數刪除所有的eee


    解題思路

    線頭dpdpdp
    fi,jf_{i,j}fi,j?表示越過iii一次,然后fff操作是到jjj字符的最小操作次數。
    gi,j,kg_{i,j,k}gi,j,k?表示越過iii三次,然后在到iii之前的fff操作到jjj字符,在iii之后的fff操作到kkk字符的最小操作次數。

    然后動態轉移:
    fi,j={fi?1,j(j!=si,!needi)fi?1,si+2gi?1,si,j(j!=si)gi?1,si,si+2f_{i,j}=\left\{\begin{matrix} f_{i-1,j}(j!=s_i,!need_i) \\ f_{i-1,s_i}+2 \\ g_{i-1,s_i,j}(j!=s_i) \\ g_{i-1,s_i,s_i}+2 \\\end{matrix}\right.fi,j?=????????fi?1,j?(j!=si?,!needi?)fi?1,si??+2gi?1,si?,j?(j!=si?)gi?1,si?,si??+2?
    gi,j,k={fi?1,j+3(j!=si)fi?1,si+5gi?1,j,k+1(j,k!=si)gi?1,j,si+3(j!=si)gi?1,si,k+3(k!=si)gi?1,si,si+5g_{i,j,k}=\left\{\begin{matrix} f_{i-1,j}+3(j!=s_i) \\ f_{i-1,s_i}+5 \\ g_{i-1,j,k}+1(j,k!=s_i) \\ g_{i-1,j,s_i}+3(j!=s_i) \\ g_{i-1,s_i,k}+3(k!=s_i) \\ g_{i-1,s_i,s_i}+5 \end{matrix}\right.gi,j,k?=????????????????fi?1,j?+3(j!=si?)fi?1,si??+5gi?1,j,k?+1(j,k!=si?)gi?1,j,si??+3(j!=si?)gi?1,si?,k?+3(k!=si?)gi?1,si?,si??+5?

    詳細的的看這篇dalaoの題解\texttt{dalaoの題解}dalaoの題解&lt;?pleasecheckthere&lt;-please\ check\ there<?please?check?there


    codecodecode

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=70100; int n,m,ans,s[N],must[N],f[N][11],need=1,g[N][11][11]; void get_min(int &x,int y) {if(y<x) x=y;} int main() {scanf("%d\n",&n);for(int i=1;i<=n;i++){char c;scanf("%c",&c);if(c=='e')ans+=(need=1)*2;else{s[++m]=c-'a';must[m]=need;need=0;}}memset(f,0x3f,sizeof(f));memset(g,0x3f,sizeof(g));f[0][s[1]]=0;for(int i=1;i<=m;i++){for(int j=0;j<11;j++){if(!must[i]&&j!=s[i])get_min(f[i][j],f[i-1][j]);get_min(f[i][j],f[i-1][s[i]]+2);if(j!=s[i])get_min(f[i][j],g[i-1][s[i]][j]);get_min(f[i][j],g[i-1][s[i]][s[i]]+2);for(int k=0;k<11;k++){if(j!=s[i])get_min(g[i][j][k],f[i-1][j]+3);get_min(g[i][j][k],f[i-1][s[i]]+5);if(j!=s[i]&&k!=s[i])get_min(g[i][j][k],g[i-1][j][k]+1);if(j!=s[i])get_min(g[i][j][k],g[i-1][j][s[i]]+3);if(k!=s[i])get_min(g[i][j][k],g[i-1][s[i]][k]+3);get_min(g[i][j][k],g[i-1][s[i]][s[i]]+5);}}}printf("%d",f[m][10]+ans-2); } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Loj2687,jzoj3320-文本编辑器【线头dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

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