HDU3109: Worms(字符串变换类 DP)
2024-09-01 23:45:39
pro:开始有一个字母虫,然后字母虫在每一天可以选择自己身上的部分字母变换,变换规则形如A->BC。 现状给定最终字母虫的字符串,求最少用了多少天。
如有规则A->BC,B->AC,C->AB;则ACAB可以见过三天(A-BC-ACC-ACAC)或者两天(A-BC-ACAB)得来。 规则不超过80,字符串长度不超过50;
sol:dp[i][j][p]表示,最开始只有字母p,变换到[i,j]区间的最小天数。
显然初始:dp[i][i][x]=c[i]==x?0:inf;
其他: dp[i][j][x]=min(dp[i][k][p],dp[k+1][j][q]+1); 当且当存在规则x->pq;
经验:在倒推比较难的情况下,我们表示的状态可以是最初状态。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
char c[maxn],s[maxn*][];
int dp[maxn][maxn][maxn];
vector<int>A[],B[];
int main()
{
int N,L;
while(~scanf("%d",&N)){
if(!N) break;
rep(i,,) A[i].clear(),B[i].clear();
rep(i,,N){
scanf("%s",s[i]);
A[s[i][]-'A'].push_back(s[i][]-'A');
B[s[i][]-'A'].push_back(s[i][]-'A');
}
scanf("%s",c+); L=strlen(c+);
rep(i,,L) rep(j,i,L) rep(k,,) dp[i][j][k]=L+;
rep(i,,L) dp[i][i][c[i]-'A']=;
rep(i,,L) {
rep(l,,L-i){
int r=l+i;
rep(p,,){
rep(k,l,r-){
for(int t=;t<A[p].size();t++){
dp[l][r][p]=min(dp[l][r][p],max(dp[l][k][A[p][t]],dp[k+][r][B[p][t]])+);
}
}
}
}
}
int ans=L+;
rep(i,,) if(dp[][L][i]!=-) ans=min(ans,dp[][L][i]);
if(ans==L+) ans=-;
printf("%d\n",ans);
}
return ;
}
最新文章
- 8 HTML&;JS等前端知识系列之Ajax的例子
- ORA-12569: TNS: 包校验和失败解决方法一例
- KDE、GNOME 和 XFCE 桌面比较
- display 和 visibility 的区别
- WIN 8.1 x64 环境下 COM Surrogate 停止工作解决方案
- Java 多线程 锁 存款 取款
- Redis+PHP扩展的安装和Redis集群的配置 与 PHP负载均衡开发方案
- iOS应用之间的跳转与数据传递
- 关于 HTML5 的 11 个让人难以接受的事实
- T-SQL语句中中括号([])的用法是什么,什么时候该用
- Morris遍历-如何用空间复杂度O(1)来遍历二叉树
- Hadoop 2.7.3 完全分布式维护-简单测试篇
- mac下安装rzsz
- 爬虫利器_you-get
- Linux(Ubuntu)下也能用搜狗输入法了!!!
- send anywhere真的好用啊
- 如何把GitHub中的开源项目导入到Eclipse
- 淘宝网前端开发面试题(二)--JS 面试题
- Codeforces 1099 B. Squares and Segments-思维(Codeforces Round #530 (Div. 2))
- SOAP UI
热门文章
- 全网最详细的Windows里Git client客户端管理工具SourceTree的下载与安装(图文详解)
- RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】
- golang(一)
- Service must be explitict android 5.0问题
- C#-Windows服务创建和运行
- C# vb .net实现焦距淡色特效滤镜
- Windows 7 下安装 docker
- Java web服务端参数校验Javax.validation (springboot)
- 【Java基础】- Java学习路线图
- Android Studio 打包生成apk