1. 程式人生 > >NOJ 1526 最長等差子序列

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 //************************************************************************************