赞
踩
有数字三角形模型、LIS、LCS、走网格、最大子矩阵
数字三角形模型
#include <iostream> #include <algorithm> using namespace std; const int N = 1005; int a[N][N], dp[N][N]; int main(void) { int r; cin >> r; for (int i = 1; i <= r; i++) for (int j = 1; j <= i; j++) cin >> a[i][j]; for (int i = 1; i <= r; i++) dp[i][1] = dp[i - 1][1] + a[i][1]; for (int i = 1; i <= r; i++) dp[i][i] = dp[i - 1][i - 1] + a[i][i]; for (int i = 3; i <= r; i++) for (int j = 2; j < i; j++) dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + a[i][j]; int res = 0; for (int j = 1; j <= r; j++) res = max(res, dp[r][j]); cout << res << endl; return 0; }
因为需要记录路径,我的办法是用一个数组来记录前驱,存入一个栈
#include <bits/stdc++.h> using namespace std; const int N = 205; int arr[N], dp[N], pri[N]; // pri记录前驱 int main(void) { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> arr[i]; dp[i] = 1; } for (int i = 1; i <= n; i++) { for (int j = 1; j < i; j++) { // 记录前驱 if (arr[i] >= arr[j] && dp[i] < dp[j] + 1) { pri[i] = j; dp[i] = max(dp[i], dp[j] + 1); } } } int res = 0, st; for (int i = 1; i <= n; i++) { if (res < dp[i]) { st = i; } res = max(res, dp[i]); } cout << "max=" << res << endl; stack<int> stk; for (int i = st; i != 0; i = pri[i]) { stk.push(arr[i]); } while (stk.size()) { cout << stk.top() << " "; stk.pop(); } cout << endl; return 0; }
注意最后会读入一个EOF,所以 n 需要减1
贪心的思路,一开始没想到
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。