关于洛古p1019单次接龙的一点看法
/*
注:原题解转载的其他人的,只是加了一些个人想法
1.lin为存单词的数组,t为输入单词的个数,vis数组存的是使用的次数,、
len数组表示没一个单词的长度 。
2.此题目的状态是单词的位置和长度(i,length)
*/ #include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
struct node{ char lin[1000];
}s[20]; // 结构体 s 用于储存单词
/*
此步解决了保存单词的问题,使可以一个一个字母的保存,
反思也可以在输入一些单词,按单词长度从大到小输出
*/
int t,ans;
int vis[20]; //标记数组,每一次搜索初始化为 0,单词使用一次加一,超过二就不能继续使用 ,即小于等于2.
int len[20]; //单词长度数组,表示每一个单词的长度
/*
found函数
stp选择的上一个单词下标,i为后一个,例子在后面
首先 进行for循环,循环的意义也就是从之前的单词最后一个开始和
后面的单词从前向后比较。
所以总结一下循环的意义
1.在dp中确定长度l和范围
2.在字符串搜索中是两个单词比较,可参照kmp算法。如果(if)在for循环中的q与后面单词的第一个字母相等,那就好办了,直接往后搜索。做判断用的。然后定义一个相同位数,后面dfs说过。从q开始向前一个单词最后一个字母前进,后面的单词从第一个字母向后面前进,一一比较。比较不过的内层for循环就break。注意!一定要比到上一个字符的最后一个字符答案才有效因为要从 最后一个字母接嘛。然后返回x。
*/int found(int stp,int i){ //stp代表上一个已经选择的单词下标 i表示当前的单词下标 int q,w,j; for(q=len[stp]-1;q>=1;q--){ //为使长度最长,从上一个单词的末尾开始搜索 if(s[stp].lin[q]==s[i].lin[0]){ //第一个字符匹配后继续看后面还有多少位 int x=0; //相同位数 for(w=q,j=0;w<len[stp]&&j<len[i];w++,j++){ if(s[stp].lin[w]==s[i].lin[j])x++; else break; } if(w==len[stp])return x;//注意!一定要比到上一个字符的最后一个字符答案才有效 } } return 0;
}
/*
dfs函数
dfs函数的状态就是(i,length),也就是已知量,目的是求输出
以此字母开头的最长的“龙”的长度。stp指的是上一个已经选择的单词,也就是“i”
*/void dfs(int stp,int length){ //上一个已经选择的单词 当前的最长单词长度 int i; bool mark=false;//以旗子来判断,是否找到 for(i=0;i<t;i++){ if(vis[i]>2)continue;//单词已经被找过两次以上,跳过 int x=found(stp,i); //x代表上一个单词与当前单词的匹配位数 if(x!=0){ //匹配位数不为0就继续进行下一次的单词搜索 mark=true; length+=(len[i]-x); //当前长度增加//举个例子,比如length和theacter,这两个单词有th这两个字母//重合的,所以结合就是lengtheacter,所以length+=(len[i]-x); vis[i]+=1; //当前单词用过一个加一 dfs(i,length);//然后i就变成了“上一个”继续去找了。 //上一步递归不符合题意返回至此,长度减去不符合题意的单词,单词的使用次数减一,继续选择单词 length-=(len[i]-x); //回溯法原理。 vis[i]-=1; } } if(mark==false){ //如果已经找不到单词,比较之前已经得到过的答案选择最长的单词数 ans=max(ans,length); }
}
int main(){ int i; char l1; cin>>t; for(i=0;i<t;i++){ cin>>s[i].lin; len[i]=strlen(s[i].lin); } cin>>l1; ans=0; memset(vis,0,sizeof(vis)); //初始化单词标记数组 for(i=0;i<t;i++)if(s[i].lin[0]==l1){ vis[i]++; //每个单词使用一次,一个一个来。 dfs(i,len[i]);//当前使用的单词下标与长度 } cout<<ans;//输出结果 return 0;
}
看法都在注释里面
关于洛古p1019单次接龙的一点看法相关推荐
- 我对洛伦兹曲线与GINI系数的一点看法
数据分析有时需要针对单变量进行数据描述,有时需要针对多变量之间的关系进行数据描述,洛伦兹曲线就是为描述多变量间关系而服务的.洛伦兹曲线即累计频数分布曲线,用于分析社会财富.土地.工资分配是否公平的问题 ...
- 深度优先搜索——单词接龙(洛谷 P1019)
题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...
- 信息学奥赛一本通 1220:单词接龙 | 1913:【00NOIP普及组】单词接龙 | OpenJudge NOI 2.5 8783 | 洛谷 P1019 [NOIP2000 提高组] 单词接龙
[题目链接] ybt 1220:单词接龙 ybt 1913:[00NOIP普及组]单词接龙 OpenJudge NOI 2.5 8783:单词接龙 洛谷 P1019 [NOIP2000 提高组] 单词 ...
- 【DFS+回溯+字符串】【洛谷P1019】【单词接龙】
传送门 /*[DFS+回溯+字符串][洛谷P1019][单词接龙]https://www.luogu.com.cn/problem/P1019题意:给你很多个单词 一个开头首字母 每个单词至多用2次 ...
- android7.1+msm8937双MIC改为单MIC(晓龙相机录像声音小)
android7.1+msm8937双MIC改为单MIC(晓龙相机录像声音小) 1. 问题背景 晓龙相机录像的时候,回播视频发现外放声音非常小,但如果用耳机来听则正常. 2. 产品和参考设 ...
- android+最新手机,最新Android手机性能榜单:骁龙845+8G的它只排第三
原标题:最新Android手机性能榜单:骁龙845+8G的它只排第三 最近一段时间,各大手机厂商纷纷推出了自家的旗舰机型,尤其是小米8,vivo NEX和OPPO Find X等几款机型,让人眼前一亮 ...
- 【洛谷OJ C++】洛谷题单101 入门2分支结构 题解及学习笔记
洛谷题单101链接:https://www.luogu.com.cn/training/101#problems 笔记及题解目录: 学习笔记: P5710 [深基3.例2]数的性质 P5711 [深基 ...
- 洛古最简单50题解(1-10)
做为一名新手,首先要过一过题,找找成就感.(大佬略过).下面附上洛古最简单50题(大佬略过).以及最麻烦 AC代码,至少AC了. 目录·列表: 洛古最简单50题解(1-10) 洛古最简单50题解(11 ...
- 洛古最简单50题解(41-50)
做为一名新手,首先要过一过题,找找成就感.(大佬略过).下面附上洛古最简单50题(大佬略过).以及最麻烦 AC代码,至少AC了. 目录·列表: 洛古最简单50题解(1-10) 洛古最简单50题解(11 ...
最新文章
- Android开发环境的搭建
- 【ESSD技术解读】 云原生时代,阿里云块存储 ESSD 快照服务如何被企业级数据保护所集成?
- scpi指令转换c语言,[C#源代码]使用SCPI指令对通讯端口(RS232/USB/GPIB/LAN)进行仪器编程...
- 孤荷凌寒自学python第六十三天学习mongoDB的基本操作并进行简单封装2
- 系统 应用 数据缺一不可 云优化三步走
- 设计模式学习01策略模式记录
- 关于回归中国、反垄断等问题,Google CEO 亲口回应了
- matlab曲线导入cad,MATLAB导入CAD数据
- 2021 ACA世界大赛中国赛区王者诞生
- Charles修改ip
- Spring进阶(六):can not find proxy: set exposeproxy property on advised to make it available
- k8s实践(6)--Kubernetes安全:API Server访问控制
- matlab plot函数画线,线型和颜色
- 树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)
- 放弃csv,拥抱feather文件
- 预计销售额超20亿 长城汽车新能源购车节收获4万订单
- 诺基亚Lumia 900拥有惊人的快的方式连接
- SpringMVC 2.HelloWorld
- Retrofit的好处
- php 自动获取头像,PHP_WordPress中用于获取及自定义头像图片的PHP脚本详解,get_avatar()(获取头像)
get_avat - phpStudy...