您的位置:首页 > 其它

动态规划练习 14

2012-08-12 23:00 162 查看
题目:Bridging signals (POJ 1631)

链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1631

[code]#include <iostream>


#include <vector>


#include <limits.h>


 


using namespace std;


 


// O(nlogn)


int LIS(const vector<int> &data)


{


// if min_value[i] is j, means j is the min end value of all i length


// increasing sequences.


vector<int> min_value(data.size(), INT_MAX);


int len = 1;


 


for (size_t i = 0; i < data.size(); ++i)


{


int left = 1, right = len;


 


while (left <= right)


{


int mid = (left + right) / 2;


 


if (data[i] > min_value[mid])


{


left = mid + 1;


}


else


{


right = mid - 1;


}


}


 


// right = left - 1


// min_value[right] < data[i], min_value[left] >= data[i]


if (data[i] < min_value[left])


{


min_value[left] = data[i];


}


 


if (len < left)


{


len = left;


}


}


 


return len;


}


 


int main(int argc, char **argv)


{


int cases, n;


vector<int> data;


 


cin >> cases;


while (cases--)


{


cin >> n;


while (n--)


{


int tmp;


cin >> tmp;


data.push_back(tmp);


}


 


cout << LIS(data) << endl;


data.clear();


}


 


return 0;


}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: