求一個數組的最長遞減子序列 比如{9,4,3,2,5,4,3,2}的最長遞減子序列為{9,5,4,3,2}
分析:
用動態規劃解決,dp[i]表示a[0..i]的最長遞減子序列,dp滿足:
對於任意k, 0<=k<i
dp[i] = max{dp[k]+1, a[k]>a[i]}
如果對於任意 0<=k<i a[k] <= a[i]
dp[i] = 1
int lis(int *a, int n) { int *dp = new int[n]; dp[0] = 1; int max_i = 0; int max_len = 1; for(int i = 1; i < n; i++) { dp[i] = 1; for(int k = 0; k < i; i++) { if(a[k] > a[i] && dp[k]+1>dp[i]) { dp[i] = dp[k]+1; if(dp[i] > max_len){ max_len = dp[i]; max_i = i; } } } } return max_len; }
相關推薦
算法 - 求一個數組的最長遞減子序列(C++)
str log bst article subst else from return ear //************************************************************************************
演算法 求一個數組的最長遞減子序列 C
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
求一個數組的最長遞減子序列比如{9,4,3,2,5,4,3,2}的最長遞減子序列為{9,5, 4,3,2}
程式碼如下:<pre name="code" class="java"> public class Decrease { /** * @param PLA * */ /*演算法描述: * 用動態規劃解決此問題,設A為原陣列,另設陣列B(
求一個數組的最長遞減子序列 比如{9,4,3,2,5,4,3,2}的最長遞減子序列為{9,5,4,3,2}
分析: 用動態規劃解決,dp[i]表示a[0..i]的最長遞減子序列,dp滿足: 對於任意k, 0<=k<i dp[i] = max{dp[k]+1, a[k]>a[i]} 如果對於任意 0<=k<i a[k] <= a[i] dp
繼續對上一頁的ecah進行 優化,求一個數組的和,最大值,最小值,獲取陣列中的元素,3
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style t
動態規劃----求一個數組的最長遞減序列
#include <stdio.h> #include <stdlib.h> //http://blog.csdn.net/wumuzi520/article/details/7378306 int findLength(int * src,int
求一個數組的最長連續子序列
分析: 如果允許O(nlogn)的複雜度,那麼可以先排序,可是本題要求O(n)。 由於序列裡的元素是無序的,又要求O(n),首先要想到用雜湊表。 用一個雜湊表unordered_map<int,bool> used 記錄每個元素是否使用, 對每個元素,以該
求一個數組中是否存在兩元素,滿足相加為另一個數
給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9
求一個數組中第k大的數,要求不能另外申請空間,陣列順序不能被改變
這是一道今日頭條的面試題,當面試官提出這樣一道題目時。我想相信,大多數人都會這樣反應 1.是不是可以先排一下序,然後再求第k大的,然後就想到陣列順序不能被改變,然後否定了 2.是不是可以用小堆來做。我建立一個堆大小為k的小堆,然後把這些資料全部扔進小堆中,除了堆頂,其他的數
求一個數組中重複元素出現最多值,最大的元素及出現次數,次數相同時,取最大值,優先考慮次數
#include <iostream> #include <string> #include <map> using namespace std; void maxNumTimes(int a[], int len, int b[])
【小紅書2017年筆試】求一個數組中平均數最大的子陣列
題目: * 給一個數組,裡邊有N個整數,找長度為K(0<K<N)且平均值最大的子陣列,並把這個最大值輸出來 輸入描述:* 6 (N的值)* 1 12 -5 -6 50 3 (含有N個整數的陣列)* 4 (K的值) 輸出描述: * 12.75 題目很簡單,時
求一個數組中, 連續幾個數的最大值,及其變種
import java.util.Arrays; import java.util.Scanner; public class KeShui { public static int max = 0; //網易瞌睡 public static void maxiva
求一個數組的和最大的連續子陣列及擴充套件
在C++中a=1與a(1)有什麼區別?a=1是賦值,a(1)是一個函式值 求1億內的素數,並輸出。 #include<stdio.h> #include<math.h> const long N = 10000001; bool prime[1000
O(n)求一個數組中連續區間和的最大值
return 區間 scan CI spa 最大 %d 區間和 數組 int n, a[5000]; int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++)cin >>
求一個數組中最大值與最小值
div return urn 技術 code include 一個 最小值 array #include <stdio.h> int main() { int array[10]={100,1,40,29,45,22,98,2,83,75};
程式設計:求一個數組元素的最大值
方法1:自己 #include<stdio.h> void main(void){ int s[10] = {10, 23, 45, 1, 34, 76,100, 32, 456,54}; int i,j; int max; //求陣列s元素的最大
求一個數組中出現次數超過n/3的數(c++實現)
題目要求如下: 令A是一個長度為n的正整數序列。試設計一個時間 和空間複雜度分別為O(n)和O(1) 的演算法,判斷A中 是否存在這樣的元素x,x在序列中出現次數超過n/3。 若存在這樣的x,則將其輸出。 實現思路: 、BM(Boyer-Moore Majority V
java實現遞迴函式入門級例子:用遞迴函式求一個數組中的最大值
我們開始把陣列分為兩半,分別找出最大值,那麼這個最大值就是最後的最大值:同時我們左右兩邊繼續細分,停止條件就是細分到單個數值為止。 package chapter1; //使用遞迴求出一個數組中的最小值 public class FindMax { public sta
求一個數組的最大k個數(java)
問題描述:求一個數組的最大k個數,如,{1,5,8,9,11,2,3}的最大三個數應該是,8,9,11 問題分析: 1.解法一:最直觀的做法是將陣列從大到小排序,然後選出其中最大的K個數,但是這樣的解法,複雜度是O(logn*n),但是有時候並不需要排序,用簡單的選
求一個數組中最小的K個數字
用快排思想:import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; class Solution