感謝計算機機試群裡的大佬提供我們練習的機會。群號:299565515
動態規劃問題雖然**比較簡單,但是在構造遞推式時候是最難的,這個題的遞推式大家肯定都做過,沒錯,就是斐波那契數列的遞推式。f(n)=f(n-1)+f(n-2)。
為什麼是這樣呢?
首先我們可以從最後一層樓梯考慮。假設有10層台階,那麼每次只能走一層台階或者兩層台階的話,我可以從第8層台階和第9層台階走到第10層台階。也就是說 第10層台階的走法數=第8層台階的走法數+第9層台階的走法數
即f(10)=f(8)+f(8)。因此就推導出了我們的推導式。那麼動態規劃的邊界是哪兒呢?
通過分析題意,我們可以看到,我們處於第一級,所以f(1)=0,f(2)=1,f(3)=2,這些都是很容易得到的,有了這些,我們就可以寫**了。
最長子列和問題可以說是最常見的動態規劃問題了,我至少見過3次。
這個問題有很多種解法,包括暴力的方法,分治思想的遞迴方法,還有動態規劃方法等。
下邊我主要介紹暴力和動態規劃的方法,因為暴力當時沒有過,所以採用動態規劃的方法,後來過了。
1.暴力:
這道題是尋找最長子序列串,並且找出構成最長子序列串的首個數字和最後乙個數字。
我的思想是可以通過遍歷依次尋找,第一次可以只找乙個數字,然後遍歷一圈陣列,找出最大的存起來,第二次可以找兩個數字作為一組,然後類似滑動視窗對陣列進行遍歷,然後最後到string.size()這麼長的數字作為一組(只有乙個)
方法很通俗易懂,但是時間複雜度比較高。o(n的3次方)。
**如下:
void baoli()
record=0;
} } printf("%d %d %d\n",max,beg,ed);
}
2.動態規劃
這個題的動態規劃是最難想的,也是時間複雜度最低的吧。
我們可以這樣表示,dp[i]表示,以dp[i]結尾的元素的最長子序列和
通俗來說就是,dp[i]儲存的是i和i前的最長子序列和,有人說了,如果i後邊是正數,那麼相加肯定比dp[i]大,這個就不用i這層去考慮了,dp[i+1]層自然會考慮進去,通過分析,我們發現,dp[i]=max, a[i]表示陣列中存的輸入的子串行。
當前的最長子序列和=上一層的最長子序列和+陣列中的當前層的 數和 當前單個數的中間的最大值。
**如下:
const int maxn=10010;
int in[maxn],dp[maxn];//dp[i]表示以dp[i]結尾的最大子串行和
int p[maxn][2];
void dpway()
else
}int max=-99999;int left=0;int right=0;
for(int i=0;i
printf("%d %d %d\n",max,left,right);
}
計算機機試指南 動態規劃
1.n階樓梯上樓問題 題目描述 n階樓梯上樓問題 一次可以走兩階或一階,問有多少種上樓方式。非遞迴 輸入 輸入包括乙個整數n 1 n 90 輸出 有多組測試資料,對於每組資料,輸出當樓梯階數為n時的上樓方式個數 演算法思想 到達第n階樓梯的方式有兩種 從第n 1階樓梯走一階 從第n 2階樓梯走兩階。...
《王道論壇計算機考研機試指南》第七章 動態規劃
n階樓梯上樓問題 include using namespace std int f 91 int main 不容易系列之一 攔截飛彈 include include using namespace std intlist 26 按襲擊事件順序儲存各飛彈高度 int dp 26 dp i 儲存以第i...
N諾 計算機考研機試衝刺模擬卷(一)
題目鏈結 題目描述 思路分析 先把初始餅的大小按照從小到大的順序進行排列,然後與待排列陣列進行對比。如果對應相等,就翻轉。目的就是把大的翻到地下,並且翻轉完成之後,不用再去管翻好的 此處是由t來控制這個過程 具體過程如下圖所示 include using namespace std int ans ...