n個不同的正整數,找出由這些數組成的最長的等差數列。
例如:1 3 5 6 8 9 10 12 13 14
等差子數列包括(僅包括兩項的不列舉)
1 3 5
1 5 9 13
3 6 9 12
3 8 13
5 9 13
6 8 10 12 14
其中6 8 10 12 14最長,長度為5。
因為沒看清題目意思糾結了好久,題目說的是找出由這些數組成的最長的等差數列,而不需要這些數字的排列順序和輸入的一樣,這樣我們就可以排序之後在來考慮。因為之前一直覺得題意是等差數列的順序應該和輸入的數字的順序一樣。。。。。。
因為題目所給的陣列的範圍是10000,所以我們可以考慮n^2的演算法來寫。
剛開始想了好久不知道dp應該怎麼弄,最後突然想到可以用dp[i][j]其中的i,j代表的是ap最前面的兩個元素,並且i我們可以想到,不管i,j的位置是什麼,dp[i][j]最小值為2,我們可以先初始化。
然後我們先固定j,向兩邊擴充套件i=j-1,k=j+1。當2*a[j]==a[i]+a[k]的時候,說明a[i],a[j],a[k]可以組成ap,這時候dp[i][j] = dp[j][k]+1 .
具體看**
#include #include #include #include #include using namespace std ;
int const maxn = 10005;
int a[maxn];
short int dp[maxn][maxn];
//dp[i][j]表示的是以i和j為前兩個元素的ap最長值,i= 1 ; j--)
else if(a[i]+a[k]>2*a[j])
else}}
printf("%d\n",ans);
}return 0 ;
}
51nod 1055 最長等差數列
原題鏈結 1055 最長等差數列 基準時間限制 2 秒 空間限制 262144 kb 分值 80 難度 5級演算法題 n個不同的正整數,找出由這些數組成的最長的等差數列。例如 1 3 5 6 8 9 10 12 13 14 等差子數列包括 僅包括兩項的不列舉 1 3 5 1 5 9 13 3 6 9...
51nod 1055 最長等差數列
n個不同的正整數,找出由這些數組成的最長的等差數列。例如 1 3 5 6 8 9 10 12 13 14 等差子數列包括 僅包括兩項的不列舉 1 3 5 1 5 9 13 3 6 9 12 3 8 13 5 9 13 6 8 10 12 14 其中6 8 10 12 14最長,長度為5。input ...
51nod 1055 最長等差數列(DP)
1055 最長等差數列 基準時間限制 2 秒 空間限制 262144 kb 分值 80 難度 5級演算法題 n個不同的正整數,找出由這些數組成的最長的等差數列。例如 1 3 5 6 8 9 10 12 13 14 等差子數列包括 僅包括兩項的不列舉 1 3 5 1 5 9 13 3 6 9 12 3...