这题的提议很容易理解错,一开始按照他的sample int 和 out都无法推理出。
假设有A B C D四个事件,发生顺序 4 2 3 1 是指 第一个事件是第四个发生的,即 A事件是第四位发生,所以事件的发生顺序为 D B C A。
这题用动态规划的思想做,不过感觉自己写的不是很正宗。
1 #include<iostream> 2 using namespace std; 3 int numevents[21]; 4 int d[21]; //假设状态为d,即按照学生提供的事件顺序(不是他的那串输入数字),d[i]表示第i个数字能够达到的最长序列 5 int path[21]; 6 int temp[21]; 7 int maxdis; 8 int n; 9 int dis(int start){ 10 if(d[start]>-1) 11 return d[start]; 12 13 for(int i=start+1;i<=n;i++){ 14 if(numevents[path[start]]<numevents[path[i]]) 15 if(d[start]<1+dis(i)) 16 d[start]=1+dis(i); 17 } 18 if(d[start]>-1) 19 return d[start]; 20 d[start]=1; 21 return d[start]; 22 } 23 int main(){ 24 int m; 25 cin>>n; 26 for(int i=1;i<=n;i++){ 27 cin>>m; 28 numevents[i]=m; 29 } 30 while(cin>>m){ 31 path[m]=1; 32 d[1]=-1; 33 for(int i=2;i<=n;i++){ 34 cin>>m; 35 path[m]=i; 36 d[i]=-1; 37 } 38 maxdis=0; 39 for(int i=1;i<=n;i++){ 40 if(maxdis<dis(i)) 41 maxdis=dis(i); 42 } 43 cout<<maxdis<<endl; 44 } 45 }
111 - History Grading,布布扣,bubuko.com
原文:http://www.cnblogs.com/royjwy/p/3571577.html