您的位置:首页 > 其它

uva 111 - History Grading

2014-02-27 15:13 274 查看
这题的提议很容易理解错,一开始按照他的sample int 和 out都无法推理出。

假设有A B C D四个事件,发生顺序 4 2 3 1 是指 第一个事件是第四个发生的,即 A事件是第四位发生,所以事件的发生顺序为 D B C A。

这题用动态规划的思想做,不过感觉自己写的不是很正宗。

#include<iostream>
using namespace std;
int numevents[21];
int d[21]; //假设状态为d,即按照学生提供的事件顺序(不是他的那串输入数字),d[i]表示第i个数字能够达到的最长序列
int path[21];
int temp[21];
int maxdis;
int n;
int dis(int start){
if(d[start]>-1)
return d[start];

for(int i=start+1;i<=n;i++){
if(numevents[path[start]]<numevents[path[i]])
if(d[start]<1+dis(i))
d[start]=1+dis(i);
}
if(d[start]>-1)
return d[start];
d[start]=1;
return d[start];
}
int main(){
int m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
numevents[i]=m;
}
while(cin>>m){
path[m]=1;
d[1]=-1;
for(int i=2;i<=n;i++){
cin>>m;
path[m]=i;
d[i]=-1;
}
maxdis=0;
for(int i=1;i<=n;i++){
if(maxdis<dis(i))
maxdis=dis(i);
}
cout<<maxdis<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: