NOIP 2000 单词接龙
2015-09-15 09:35
197 查看
DFS
这个题看数据范围显然深搜是可以的。
然而本蒟蒻的代码实在是太麻烦 没有脸公开QAQ
但是看到一段优美的代码 (没有传字符数组有木有 只有两个整数)
于是跑来发个题解~~
原代码链接在这里
原代码
这是我的代码 区别么…… 可以说太蒟蒻了不知strcmp怎么加长度 于是自己编了一个 mctrcmp才过么……
//k表示当前字符串以k结尾 len表示字符串合并到目前的长度
//由于之前的只有第k个字符串的结尾对当前的合并有影响 所以只要记录之前的字符串有无合并并且当前结尾字符串是什么就可以进行深搜
//f[i][j] 表示以第i个字符串结尾的合并字符串(也可以未合并 i当做第一个)与 第j个字符串合并后的贡献 即增加的长度
//代码很好懂 就多说了~
//有没有觉得很优美~~
既然选择了远方,便只顾风雨兼程。
这个题看数据范围显然深搜是可以的。
然而本蒟蒻的代码实在是太麻烦 没有脸公开QAQ
但是看到一段优美的代码 (没有传字符数组有木有 只有两个整数)
于是跑来发个题解~~
原代码链接在这里
原代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char str[20][1001]; char tmp[1001]; int f[20][20]; int used[20]; int ans; int n; void srch(int k, int len) { int i; if(len > ans){ ans = len; } used[k]++; for(i = 0; i < n; i++){ if(f[k][i] > 0 && used[i] < 2){ srch(i, len + f[k][i]); } } used[k]--; } int main(int argc, char **argv) { int i, j; char *p, c; scanf("%d", &n); for(i = 0; i < n; i++){ scanf("%s\n", str[i]); } for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ strcpy(tmp, str[i]); p = &tmp[strlen(tmp) - 1]; while(p != tmp){ if(*p == str[j][0] && strncmp(p, str[j], strlen(p)) == 0){ f[i][j] = strlen(str[j]) - strlen(p); break; } p--; } } } scanf("%c", &c); for(i = 0; i < n; i++){ if(str[i][0] == c){ srch(i, strlen(str[i])); } } printf("%d\n", ans); return 0; }
这是我的代码 区别么…… 可以说太蒟蒻了不知strcmp怎么加长度 于是自己编了一个 mctrcmp才过么……
#include <cstdio> #include <cstring> char str[20][1001]; char tmp[1001]; int f[20][20]; int used[20]; int ans,n; void srch(int k,int len) { int i; if(len>ans)ans=len; used[k]++; for(int i=0;i<n;i++) { if(f[k][i]>0&&used[i]<2) { srch(i,len+f[k][i]); } } used[k]--; } inline int mstrcmp(char *p1,char *p2,int len) { for(int i=0;i<len;i++) if(p1[i]!=p2[i])return 1; return 0; } int main() { int i,j; char *p,c; scanf("%d",&n); for(i=0;i<n;i++) scanf("%s\n",str[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) { strcpy(tmp,str[i]); p=&tmp[strlen(tmp)-1]; while(p!=tmp) { if(*p==str[j][0]&&mstrcmp(p,str[j],strlen(p))==0) { f[i][j]=strlen(str[j])-strlen(p); break; } p--; } } scanf("%c",&c); for(int i=0;i<n;i++) if(str[i][0]==c) srch(i,strlen(str[i])); printf("%d\n",ans); return 0; }
//k表示当前字符串以k结尾 len表示字符串合并到目前的长度
//由于之前的只有第k个字符串的结尾对当前的合并有影响 所以只要记录之前的字符串有无合并并且当前结尾字符串是什么就可以进行深搜
//f[i][j] 表示以第i个字符串结尾的合并字符串(也可以未合并 i当做第一个)与 第j个字符串合并后的贡献 即增加的长度
//代码很好懂 就多说了~
//有没有觉得很优美~~
既然选择了远方,便只顾风雨兼程。
相关文章推荐
- jQuery实现checkbox 全选,全不选功能
- 浅谈Linux内核哈希表
- 详解HTML<head> 头标签元素的意义以及使用场景
- qt 程序启动参数 -qws
- Java关键字final、static使用总结
- GitHub上值得关注的iOS开源项目
- STM32CubeMX安装指南
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- nginx redis tomcat 分布式web应用 session共享
- 01_mybatis快速入门
- Spring面试问答Top 25
- JavaMail邮件发送-发送一个文本邮件和一些问题说明
- android fragment返回键被dialog屏蔽
- Oracle使用——PLSQL的中文乱码显示全是问号
- 基于STM32Cube的ADC模数采样设计
- 02_mybatis的CRUD操作
- 01_mybatis快速入门
- RESTful设计风格
- spin_lock & mutex_lock的区别? .
- Swift调用C/C++/OC语言桥接文件命名规则