[线头dp] Jzoj P3320 文本编辑器
题解
- 新玩意
- 推荐大家去看这篇博客(点我)
- 详细明了
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 const int N=70010,M=11; 6 int n,cnt,f[N][M],g[N][M][M]; 7 char s[N]; 8 bool col[N]; 9 int main() 10 { 11 scanf("%d",&n),scanf("%s",s+1); 12 col[1]=1,s[1]-='a'; 13 for (int i=2;i<=n;i++) 14 { 15 if (s[i]=='e') cnt++; else if (s[i-1]==4) col[i]=1; 16 s[i]-='a'; 17 } 18 memset(f,63,sizeof(f)),memset(g,63,sizeof(g)),f[0][s[1]]=0; 19 for (int i=1;i<=n;i++) 20 { 21 if (s[i]==4) 22 { 23 memcpy(f[i],f[i-1],sizeof(f[i])),memcpy(g[i],g[i-1],sizeof(g[i])); 24 continue; 25 } 26 for (int j=0;j<M;j++) 27 { 28 if (j!=s[i]&&!col[i]) f[i][j]=min(f[i-1][j],f[i][j]); 29 f[i][j]=min(f[i][j],f[i-1][s[i]]+2); 30 if (s[i]!=j) f[i][j]=min(f[i][j],g[i-1][s[i]][j]); 31 f[i][j]=min(f[i][j],g[i-1][s[i]][s[i]]+2); 32 for (int k=0;k<M;k++) 33 { 34 if (j!=s[i]) g[i][j][k]=min(g[i][j][k],f[i-1][j]+3); 35 g[i][j][k]=min(g[i][j][k],f[i-1][s[i]]+5); 36 if (j!=s[i]&&k!=s[i]) g[i][j][k]=min(g[i][j][k],g[i-1][j][k]+1); 37 if (k!=s[i]) g[i][j][k]=min(g[i][j][k],g[i-1][s[i]][k]+3); 38 if (j!=s[i]) g[i][j][k]=min(g[i][j][k],g[i-1][j][s[i]]+3); 39 g[i][j][k]=min(g[i][j][k],g[i-1][s[i]][s[i]]+5); 40 } 41 } 42 } 43 printf("%d",f[n][M-1]+cnt*2-2); 44 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步