博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划解决贴纸拼字游戏
阅读量:3941 次
发布时间:2019-05-24

本文共 2736 字,大约阅读时间需要 9 分钟。

文章目录

题目描述

我们给出了 N 种不同类型的贴纸。每个贴纸上都有一个小写的英文单词。

你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target。

如果你愿意的话,你可以不止一次地使用每一张贴纸,而且每一张贴纸的数量都是无限的。

拼出目标 target 所需的最小贴纸数量是多少?如果任务不可能,则返回 -1

分析

首先定义f(i,j)表示得到目标字符串中i-j号下标组成的字串所需要的最少的贴纸的数量

则 f(i,j) = min( f(i,k), f(k,j) ); (i < k < j )
由递推关系式可写出代码

#include 
#include
#include
#include
using namespace std;/***********************************************************************************我们给出了 N 种不同类型的贴纸。每个贴纸上都有一个小写的英文单词。你希望从自己的贴纸集合中裁剪单个字母并重新排列它们,从而拼写出给定的目标字符串 target。如果你愿意的话,你可以不止一次地使用每一张贴纸,而且每一张贴纸的数量都是无限的。拼出目标 target 所需的最小贴纸数量是多少?如果任务不可能,则返回 -1["with","great"]***********************************************************************************/#define min(x,y) ((x)>(y)?(y):(x))#define INF 0x3f3f3fconst int MAX_LENGTH = 20;int dp[MAX_LENGTH][MAX_LENGTH];/********************************************************************************** * 动态规划 * dp[i][j] 表示 i 到 j 的最小贴纸的数量 *********************************************************************************/class CMyclass{
public: int fun(string des) {
for(int i = 0; i < des.size(); i++) {
dp[i][i] = 0; } for(int i = 1; i <= des.size(); i++) {
for(int j = 0; j+i <= des.size(); j++) {
string s(des.begin()+j,des.begin()+j+i); int k = 0; //若s可以整个被剪出,则最少贴纸为1 for(; k < _str.size(); k++) {
if(strstr(_str[k].c_str(),s.c_str())) {
dp[j][j+i] = 1; break; } } //若s不能被剪出,则找出中间第k个位置最少的贴纸 if(k >= _str.size()) {
if(s.size() == 1) {
return -1; } int minNum = INF; dp[j][j+i] = INF; for(k = j; k < j+i; k++) {
minNum = min(dp[j][k]+dp[k][j+i],minNum); } dp[j][j+i] = minNum; } } } return dp[0][des.size()]; } void setStr() {
cout << "输入字符串的个数:"; int size; cin >> size; for(int i = 0; i < size; i++) {
string str; cin >> str; _str.push_back(str); } }private: vector
_str;};int main(){
//string str = "abcdefg"; /* string tmp(str.begin()+3,str.begin()+5); cout << tmp << endl; */ CMyclass my; string des = "abc"; my.setStr(); cout << my.fun(des) << endl; return 0;}

转载地址:http://cxnwi.baihongyu.com/

你可能感兴趣的文章
Linux下,write/read,recv/send, recvfrom/sendto的区别
查看>>
ubuntu下 rc.local的脚本不运行
查看>>
Linux下简单Makefile文件的编写
查看>>
linux下配置JDK JAVA环境
查看>>
解决Ubuntu 14.04 grub选择启动项10秒等待时间
查看>>
Python函数操作集锦之字符串测试、判断函数
查看>>
Python字符串操作集锦之字符串映射表
查看>>
Python字符串操作集锦之字符串编码解码函数
查看>>
Python字符串类型转换函数
查看>>
Python有用的命令
查看>>
Python条件语句
查看>>
Python eval()函数
查看>>
Linux rz和sz命令详解
查看>>
Python 集合set
查看>>
Codeforces Round #400 (Div. 1 + Div. 2, combined)D - The Door Problem(2-sat)
查看>>
IDEA中Struts2文件上传时404错误The origin server did not find a current representation for the target resour
查看>>
Perl/Tk 变量追踪及类线程实现
查看>>
1.嵌入式开发环境搭建--虚拟机安装(unbutu)系统
查看>>
2.嵌入式开发环境搭建--(unbutu)系统
查看>>
Linux USB驱动分析之USB2.0协议分析
查看>>