我們設f[n]為總的方案數,right為向右走的方案數,left為向左的方案數,up為向上的方案數,f[n] = right[n]+left[n]+up[n];
我們發現向左走的方案數只能由前一步向右走和向上走轉移過來,同樣的,向右走由前一步向左走和向上走轉移過來,向上走由向左,右,上轉移過來,那麼
right[n] = left[n-1] + up[n-1];
left[n] = right[n-1] + up[n-1];
up[n] = right[n-1] + left[n-1] + up[n-1];
我們發現:up[n-1] = f[n-1],right[n] + left[n] = left[n-1]+up[n-1]+right[n-1]+up[n-1]=
f[n-2]+up[n-1] = f[n-2]+f[n-1];
所以f[n] = 2*f[n-1]+f[n-2];
#include
#include
#include
#include
using
namespace
std;
int f[50000];
int main()
每日一題 92 快速排序
題目來自網路 題目 1 基於陣列的快速排序 題目 2 基於鍊錶的快速排序 題目 1 基於陣列的快速排序 思路 使用分治的思想,先選擇樞軸,之後執行一次劃分,並把原序列劃分兩個子串行,之後遞迴處理。int partition int narr,int nstart,int nend narr nsta...
每日一題力扣92
反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。class solution def reversebetween self,head listnode,m int,n int listnode if m n return head dummy listnode 1 dummy.next h...
每日一題 92 歸併排序
題目來自網路 題目 1 基於陣列的歸併排序 題目 2 基於鍊錶的歸併排序 題目 1 基於陣列的歸併排序 思路 借助分治的思想,總是先對待排序進行分割,之後再對兩個子串行進行合併,生成乙個有序序列。時間複雜度為o nlogn 空間複雜度為o n void merge int narr,int nsta...