uva-10602-贪心
Posted shuiyonglewodezzzzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva-10602-贪心相关的知识,希望对你有一定的参考价值。
题意:有个编辑器,支持三种操作,摁下一个键盘上的字符,重复最后一个单词,删除最后一个字符.给N个字符串,必须先在编辑器内输入第一个字符,
问,输入完所有字符串最少需要摁下多少次键盘.
最多100个字符串,每个字符串长度最多为100.
可以观察到,为了使摁下键盘的次数最少,必须尽可能的利用当前输入的最后一个字符串.考虑到俩个操作,重复最后一个字符串,删除最后一个字符,那么,只要前缀是匹配的,就可以通过这
俩个操作来减少摁下键盘的次数.所以每次都找前缀匹配最大的字符串即可.
老罗一定做过这个题,而且抄袭了这个创意,用语音控制输入.
#include <string> #include<iostream> #include<map> #include<memory.h> #include<vector> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<math.h> #include<iomanip> #include<bitset> #include"math.h" namespace cc { using std::cout; using std::endl; using std::cin; using std::map; using std::vector; using std::string; using std::sort; using std::priority_queue; using std::greater; using std::vector; using std::swap; using std::stack; using std::bitset; constexpr int N = 110; int cases; char strs[N][N]; char cur[N]; int total = 0; int n; void solve() { cin >> cases; while (cases--) { cin >> n; total = 0; memset(strs,0,sizeof(strs)); for (int i=0;i<n;i++) { scanf("%s",strs[i]); } total += strlen(strs[0]); memcpy(cur,strs[0],sizeof(strs[0])); int vis[N] = {0}; int seqs[N] = {0}; int seq = 0; seqs[seq++] = 0; vis[0] = 1; while (true) { int nextIndex = -1; int min = -1; int curL = strlen(cur); for (int i=0;i<n;i++) { if (vis[i] != 0) continue; int curMin = 0; for (int j=0;j< curL;j++) { if (strs[i][j] == ‘