dp[ i+1 ][ j+1 ]=dp[ i ][ j ]+1 ( s[i]==t[j] )
dp[ i+1 ][ j+1 ]=max(dp[ i ][ j+1 ] , dp[ i+1 ][ j ] ) (其他)
看了好多大神的部落格,總結了以下**:
#includeusing namespace std;
const int max_n=2005;
string s,t;
int dp[max_n][max_n];
int pre[max_n][max_n]; //標記路徑
vectorans; //儲存路徑
void output(int x,int y)
else if(pre[x][y]==2)
else if(pre[x][y]==3)
}int main()
else
} }
cout<
pre陣列和output函式是用來儲存路徑的,不需要的話直接去掉就行。
dp[ i ] :以a[ i ] 為結尾的最長上公升子串行的長度:
以a[i]為結尾的上公升子串行有兩類:
1:只包含a[ i ]的子串行,元素個數為1 ,(一開始就對左右元素的dp值初始化為1);
2:在滿足j < i 並且 a[ j ] < a[ i ] 的以a[ j ]結尾,追加上a[ i ]得到的子序.
(1)o(n^2)複雜度解決方案:
#includeusing namespace std;
const int max_n=2005;
int a[max_n];
int dp[max_n];
int pre[max_n]; //標記路徑,記錄前驅
int max_pos = 0; //最大位置
vectorans; //儲存路徑
void dfs(int pos)
else
}int main()
int res = 0; //最長上公升子串行的長度
memset(pre,-1,sizeof(pre));
for(i=0;ia[j] && dp[i]=res)}}
}cout
dp[ i ] :長度為i+1的上公升子串行中末尾元素的最小值(不存在即為inf)
這個dp陣列的更新非常有意思,自己可以下去模擬一下,但是要注意,dp陣列只能儲存最長上公升子串行的長度,而不能儲存正確的子串行。
比如 1 3 5 2 :dp陣列最後儲存的會是1 2 5 ,顯然,這不是正確的順序。
那麼怎麼儲存路徑呢?
傳送門 (lis路徑還原)
#includeusing namespace std;
const int max_n=2005;
const int inf=0x3f3f3f3f;
int a[max_n];
int dp[max_n];
int pre[max_n]; //標記路徑,記錄前驅
int pos[max_n];
vectorans; //儲存路徑
void output(int pos)
ans.push_back(pos+1);
}int main()
fill(dp,dp+n,inf);
pos[0]=-1;
int i,now;
for(i=0;i
int k=lower_bound(dp,dp+n,inf)-dp;
cout<
output(pos[k-1]);
for(int i=0;i
}}
最短路徑演算法及解析
深入解析最短路徑演算法 正文第一節 問題的提出及解決方法 所謂最短路徑問題,可以說有兩種情況來描述。描述一 在圖論中,指的是尋找圖中兩個節點之間的最短距離。如下圖 描述二 在現實生活中,指的是找到從乙個地方到另乙個地方的最近距離。如下圖 上述兩種情況的本質是一樣的,即求乙個點到另乙個點的最短路徑。好...
板子 Floyd演算法及路徑記錄
floyd演算法實現 將距離矩陣初始化為鄰接矩陣,然後做乙個三層的for迴圈 至於給出路徑只要對path二維陣列進行遞迴就行了 int matrix n n int dist n n int path n n for int i 0 i n i floyd演算法實現 for int k 0 k n ...
Plist檔案儲存及沙盒路徑詳解
property list屬性列表檔案 它是一種用來儲存序列化後的物件的檔案。屬性列表檔案的擴充套件名為.plist 因此通常被稱為 plist檔案。檔案是xml格式的。plist檔案通常用於儲存使用者設定,也可以用於儲存 的資訊。1 工程裡的檔案路徑 nsbundle bundle nsbundl...