bzoj 1055: [HAOI2008]玩具取名【区间dp】
2024-08-28 01:12:57
不难想,就是处理起来比较麻烦
设f[i][j][k]为是否可以把区间(i,j)合并为k,初始状态是f[i][j][s[i]]=1,转移的话另一段枚举长度x,向(i-x,j),(i,j+x)转移
把四个字符hash成1234比较好写(大概
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=205;
int n,c[10],mp[N];
bool f[N][N][10],fl,a[10][10][10];
char ch[5],s[N],rl[10];
int main()
{
mp['W']=1,mp['I']=2,mp['N']=3,mp['G']=4;
rl[1]='W',rl[2]='I',rl[3]='N',rl[4]='G';
scanf("%d%d%d%d",&c[1],&c[2],&c[3],&c[4]);
for(int i=1;i<=4;i++)
for(int j=1;j<=c[i];j++)
{
scanf("%s",ch+1);
a[mp[ch[1]]][mp[ch[2]]][i]=1;
}
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
s[i]=mp[s[i]],f[i][i][s[i]]=1;
for(int l=1;l<n;l++)
for(int i=1;i+l-1<=n;i++)
{
int j=i+l-1;
for(int k=1;k<=4;k++)
if(f[i][j][k])
{
for(int x=1;x<=l&&j+x<=n;x++)
for(int y=1;y<=4;y++)
if(f[j+1][j+x][y])
for(int z=1;z<=4;z++)
if(a[k][y][z])
f[i][j+x][z]=1;
for(int x=1;x<=l&&i-x>=1;x++)
for(int y=1;y<=4;y++)
if(f[i-x][i-1][y])
for(int z=1;z<=4;z++)
if(a[y][k][z])
f[i-x][j][z]=1;
}
}
for(int i=1;i<=4;i++)
if(f[1][n][i])
printf("%c",rl[i]),fl=1;
if(!fl)
puts("The name is wrong!");
return 0;
}
最新文章
- mysql查询本周、月、季度、年
- 工作中的sql语句总结
- 网站推广优化(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)
- ios webview 只能播放带域名的视频连接好奇怪!
- Oracle之物化视图
- Javascript中大括号“{}”的多义性
- KMP算法的Next数组详解
- C++ Socket编程步骤 【转】
- C# 多线程基础
- UESTC_秋实大哥与快餐店 2015 UESTC Training for Data Structures<;Problem C>;
- 解决VS2010打开Web页面时经常由于内存较低而导致VS2010自动关闭的问题
- C/C++指针的指针(**p)和指针的引用(*&;amp;)使用案例分析
- 比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
- MySQL数据库“十宗罪”(十大经典错误案例)
- CentOS6.3 下安装codeblocks
- PPTP支持IPv6
- c++ 的绝对值函数
- redis主从复制和sentinel配置高可用
- 若依项目整合eCharts实现图表统计功能
- REST easy with kbmMW #21 – Delphi client stubs