这题用最长上升子序列的思想怎么做??(C 语言)
Preparing for CET 6
Time Limit:50MS Memory Limit:32768K
Description:
英语6级就要开考了,可是Fatboy连单词都还没有背,这下可把他急坏了。于是他只好拿出单词册来,开始背单词。 背了一段时间后,Fatboy发现了一个背单词的高效方法。当把单词头尾相接串成一组单词后,可以一下子把串起来的所有单词都记住。比如:fatboy yard derv vivid ,这4个单词每个单词的头字母都与前一个单词的尾字母相同,那么Fatboy就可以一下子记住这4个单词。Fatboy拿着单词册,产生了一个疑问: “如果只串一次,我最多可以背多少单词呢?” 下面就请你编个程序来帮助他解决这个问题,记住:每个单词只能用一次,单词串接时单词出现的先后顺序必须和单词册中单词出现的先后顺序一样。如:假如单词册中单词出现的顺序是:12345 ,那么单词串接顺序不能是:5421或5134,而134则是一个合法串接。
Input:
每组数据第一行为数N(1≤N≤200),表示单词册里有多少个单词,紧接的N行按单词在单词册中出现顺序给出单词,输入文件以一个0表示结尾。
Output:
对应每一组单词输出一个M,表示Fatboy最多可以记住多少单词。每个输出占一行。
Sample Input:
4
fatboy
yard
derv
vivid
5
fatboy
yard
derv
vivid
uinque
2
apple
orange
0
Sample Output:
4
4
1
[解决办法]
我是个c++新手,见笑了,能告诉我上哪里找些提高的题做一做吗?不要太难的
- C/C++ code
#include <iostream>#include <fstream>#include <sstream>#include <algorithm>#include <Windows.h>using namespace std;int numOfString(string *strList, int num){ int maxNum = 1; int curNum = 1; char last; for (int i=1; i<num-1; ++i) { curNum = 1; last = strList[i-1][strList[i-1].size()-1]; for (int j=i; j<num; ++j) { if (last==strList[j][0]) { curNum++; last = strList[j].at(strList[j].size()-1); } } if (curNum>maxNum) maxNum = curNum; } return maxNum;}int main(int args, char argv[]){ LARGE_INTEGER litmp; LONGLONG QStart,QEnd; double dfFreq, dfTim; QueryPerformanceFrequency(&litmp); // freq dfFreq = (double)litmp.QuadPart; QueryPerformanceCounter(&litmp); // start QStart = litmp.QuadPart; string str; string *strList; int num = 0, curNum; ifstream in("test.txt"); while(getline(in,str)) { istringstream is(str); is >> curNum; if(0==curNum) { break; } else { num = curNum; strList = new string[num]; for (int i=0; i<num; ++i) { getline(in,strList[i]); strList[i].erase(remove_if(strList[i].begin(), strList[i].end(), isspace),strList[i].end()); } cout << numOfString(strList,num) << endl; } } in.close(); if(strList!=NULL) delete[] strList; strList = NULL; QueryPerformanceCounter(&litmp); // end QEnd = litmp.QuadPart; dfTim = (double)(QEnd-QStart)/dfFreq; // elapsed time cout << "Elapsed time: " << dfTim << " s" << endl; system("PAUSE"); return 0;}
[解决办法]
- C/C++ code
#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 200char find(char n){ if (n == 1) { return 1; } else { char buf[0x100]; struct { char last; char len; } rec[N]; int m = 1, i, max = 0; gets(buf); rec[0].last = buf[strlen(buf) - 1]; rec[0].len = 0; for (; m < n; ++m) { char l = -1; gets(buf); rec[m].last = buf[strlen(buf) - 1]; for (i = 0; i < m; ++i) { if (rec[i].last == buf[0] && rec[i].len > l) { l = rec[i].len; } } rec[m].len = l + 1; if (rec[m].len > max) { max = rec[m].len; } } return max + 1; }}int main(){ for (;;) { int n; scanf("%d\n", &n); if (n) { printf("%d\n", find(n)); } else { return 0; } }}