【二维dp】最长等差数列
2014-08-21 13:34
260 查看
这道题明显可以两重循环搞定。很简单的二维dp,但qq群里的人嚷着必须三重。废话不说上代码。
上面的hashmap查找find,理论上是常数时间。换成map的话,总复杂度就变成n^2*lgn.
#if __GNUC__>2 #include <ext/hash_map> using namespace __gnu_cxx; #else #include <hash_map> using namespace stdext; #endif #include <iostream> #include <vector> #include <algorithm> using namespace std; // using namespace stdext; int cal(vector<int> t){ sort(t.begin(),t.end()); typedef hash_map<int,int> MAP; vector<MAP> ms(t.size(), MAP()); int _max=0; for(int i=0;i<t.size();i++){ for(int j=0;j<i;j++){ int d=t[i]-t[j]; if(ms[j].find(d)==ms[j].end()){ ms[i][d]=2; } else ms[i][d]=ms[j][d]+1; _max=max(_max,ms[i][d]); } } return _max; } int main(){ vector<int> t; t.push_back(-1); t.push_back(1); t.push_back(3); t.push_back(3); t.push_back(3); t.push_back(2); t.push_back(1); t.push_back(0); cout<<cal(t)<<endl; return 0; }
上面的hashmap查找find,理论上是常数时间。换成map的话,总复杂度就变成n^2*lgn.
相关文章推荐
- 51nod 1241 特殊的排序(DP_找最长等差数列)
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- 51nod-1055-最长等差数列(dp+优化)
- POJ1609 UVALive2815 UVA1196 ZOJ1787 Tiling Up Blocks【二维最长上升子序列+DP】
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- [DP Hash] 51Nod 1055 最长等差数列
- UVa 10285 Longest Run on a Snowboard(DP 二维最长递减子序列)
- hdu 1160 dp (二维最长上升子序列 记录路径
- [dp]poj1088_滑雪 二维形式的最长下降子序列
- DP经典应用(四)二维最长上升子序列问题——矩形嵌套问题
- NUC1776 Tiling Up Blocks【二维最长上升子序列+DP】
- hdu 1160 dp (二维最长上升子序列 记录路径
- 51 nod 1055 最长等差数列(dp)
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- hdu 1160 dp (二维最长上升子序列 记录路径
- 51 nod 1055 最长等差数列(DP)