問題描述:給n個數,找出最長子序列並輸出
問題分析:本題是dag(有向無環圖)最長路問題,設d[i]為以i結尾的最長鏈的長度,則狀態轉移方程為:d[i]=max
int dfs(int cur) //
深搜,記憶化搜尋
}return
d[cur];
}void
out(int i) //
反向追蹤找到選取圖形的標號
}cout
<< a[i]<< "
";//
放在上面是倒著輸出,下面是睜著輸出
}int
main()
memset(map,
0,sizeof(map)); //
構造乙個ok關係的0-1鄰接矩陣
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(ok(i,j))
map[i][j]=1
; memset(d,
0,sizeof(d)); //
深搜記憶化完成d表
for(i=1;i<=n;i++)
int max=0,ds; //
找出d的最大值並用ds儲存尾鏈位置
for(i=1;i<=n;i++)
}cout
;
out(ds);cout<
; }
return0;
}view code
solve two:正向求解,邊輸邊計算d的值
#include#includeview codeusing
namespace
std;
#define maxn 1000+5
#define inf 1<<31
inta[maxn],d[maxn],n;
void
out(int i) //
反向追蹤找到選取圖形的標號
} cout
}int
main()
}cout
;
out(ds);
cout
<
; }
}
動態規劃 最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
動態規劃 最長上公升子串行
動態規劃 儲存遞迴中間結果,減少遞迴次數 總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。...
動態規劃 最長上公升子串行
總時間限制 2000ms 記憶體限制 65536kb 描述乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它...