NOJ 1526 最長等差子序列
思路:
把所有公差離散出來(理論上公差個數應該有(n+1)*n/2 , 不過實際最多2000個)
dp[i][j] 表示 公差為j ,以i下標為結尾的子序列 最優解
因為dp只需要考慮這次和上一次,所以用滾動陣列優化記憶體(即公差是N*N,也可以開出來)
#include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<map> using namespace std; #define N 1005 int abs(int x){return x>0?x:-x;} int a[N], dp[2][N*2], n; //理論上應該是dp[2][N*N]; map<int, int>mymap; set<int>myset; set<int>::iterator p; int main(){ int i, j, fir = 0; while(~scanf("%d",&n)){ myset.clear(); mymap.clear(); for(i = 1; i <= n; i++)scanf("%d",&a[i]); for(i = 1; i < n; i++) for(j = i+1; j <= n; j++) myset.insert(abs(a[i]-a[j])); int top = 0; for(p = myset.begin(); p != myset.end(); p++) mymap.insert(make_pair(*p, top++)); int cur = 0, ans = 1; for(j=0;j<top;j++)dp[cur][j] = 1; for(i = 2; i <= n; i++) { cur ^= 1; for(j=0;j<top;j++)dp[cur][j] = dp[cur^1][j]; for(j = i-1; j ;j--) { int cha = mymap.find(abs(a[i]-a[j])) ->second; dp[cur][cha] = max(dp[cur][cha], dp[cur^1][cha]+1); /* 錯誤剪枝,此題資料水可以這樣操作 if(dp[cur][cha]>ans) ans = dp[cur][cha]; else if(ans >= j+3)break; */ } } if(fir++)puts(""); printf("%d",ans); } return 0; }
相關推薦
NOJ 1526 最長等差子序列
思路: 把所有公差離散出來(理論上公差個數應該有(n+1)*n/2 , 不過實際最多2000個) dp[i][j] 表示 公差為j ,以i下標為結尾的子序列 最優解 因為dp只需要考慮這次和上一次,所以用滾動陣列優化記憶體(即公差是N*N,也可以開出來) #includ
noj最長公共子序列
1041.最長公共子序列 時限:1000ms 記憶體限制:200000K 總時限:3000ms 描述 一個給定序列的子序列是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列X=<x1, x2,…, xm>,則另一序列Z=<z1, z2,…, zk
最長公共子序列LCS (DP)
mem main amp code bcd max std pan ems 題意: 求兩個字符串的公共子序列,如“abcd” 與 “becd”的公共子序列是 “bcd” 分析: 設兩個字符串為 串s 和串tdp[i][j]:= s1..si和t1...tj對應的LCS長度
【HackerRank】Common Child (LCS)最長公共子序列
lin ring def imp sep content hat jin ted Given two strings a and b of equal length, what’s the longest string (S) that can be construct
【DP】最長公共子序列
amp 給定 scrip ros script print 最長 去掉 != Description 字符序列的子序列是指從給定字符序列中隨意地(不一定連續)去掉若幹個字符(可能一個也不去掉)後所形成的字符序列。令給定的字符序列X=“x0,x1,…,xm-1”,序列Y
leetcode最長遞增子序列問題
wan details img mat 最後一個元素 例如 公式 back 一個 題目描寫敘述: 給定一個數組,刪除最少的元素,保證剩下的元素是遞增有序的。 分析: 題目的意思是刪除最少的元素。保證剩下的元素是遞增有序的,事實上換一種方式想,就是尋找最長的遞增有序序列。
最長公共子序列(LCS)
公共子序列 一個 clas style == ++ 字符串 tro 我們 最長公共子序列: LIS是一個典型的用動規解決的問題。 給出兩個字符串,求出兩串的最長公共子序列的長度。 我們可以構造出他的結構特征。f(i,j)表示str1[1]~str1[i]和str2[1]~s
最長公共子序列
pac str 描述 pid scan div gre max ems 1619: P1050 時間限制: 1 Sec 內存限制: 128 MB提交: 38 解決: 28[提交][狀態][討論版] 題目描述 一個字符串A的子串被定義成從A中順次選出若幹個字符構成的串
[C++] 動態規劃之矩陣連乘、最長公共子序列、最大子段和、最長單調遞增子序列
每次 種子 () return 避免 amp 可能 text com 一、動態規劃的基本思想 動態規劃算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應於一個值,我們希望找到具有最優值的解。 將待求解問題分解成若幹個子問題,先求
[LeetCode] Longest Harmonious Subsequence 最長和諧子序列
wiki ray note maximum mon ren enc imu max We define a harmonious array is an array where the difference between its maximum value and
[網絡流24題]最長遞增子序列問題 最大流
size 個數 clu 編程 input num pac ros ini Description 給定正整數序列x1 ,... , xn 。 (1)計算其最長遞增子序列的長度s。(嚴格遞增) (2)計算從給定的序列中最多可取出多少個長度為s的遞增子序列。 (3)如果允
動態規劃 最長公共子序列
一個 then mda 偽代碼 n-2 msu csdn static 證明 最長公共子序列(LCS)問題 下面通過一個具體的例子來學習動態規劃方法 —— 最長公共子序列問題。 最長公共子串(Longest Common Substring)與最
Human Gene Functions POJ 1080 最長公共子序列變形
cee diff print bmi ces -s compare %d determine Description It is well known that a human gene can be considered as a sequence, consisting
[luoguP2766] 最長遞增子序列問題(最大流)
close spl 方法 emp 路徑 pid code display div 傳送門 題解來自網絡流24題: 【問題分析】 第一問時LIS,動態規劃求解,第二問和第三問用網絡最大流解決。 【建模方法】 首先動態規劃求出F[i],表示以第i位為開頭的最長上
【51NOD-0】1134 最長遞增子序列
子序列 can algorithm view hide 但是 open sin cst 【算法】動態規劃 【題解】經典模型:最長上升子序列(n log n) #include<cstdio> #include<algorithm> #includ
shuoj1936-D序列—最長上升子序列
div 數據 出錯 spa ont 復雜 cap ear 輸出 Description 已知兩個長度為N的數組A和B。下標從0標號至N-1。 如今定義一種D序列 (如果長度為L)。這樣的序列滿足下列條件: 1. 0 <= D[i] <= N-1 2. A[
最長公共子序列--【算法導論】
pan end art blog src http size ret bdc 最長公共子序列:一個序列 S 。假設各自是兩個或多個已知序列的子序列,且是全部符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。 其核心非常easy: 這樣,構造子結構就比較簡
POJ 1836 Alignment(DP max(最長上升子序列 + 最長下降子序列))
mission weight ring limit problem stream [0 sin ++ Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14486
求最長公共子序列
ade empty 全部 str2 comm star 要求 longest strlen 最長公共子序列,英文縮寫為LCS(Longest Common Subsequence)。其定義是。一個序列 S 。假設各自是兩個或多個已知序列的子序列。且是全部符合此條件序列中
算法 - 求一個數組的最長遞減子序列(C++)
str log bst article subst else from return ear //************************************************************************************