開啟章節選單
10690 Expression Again
題目連結
題目描述
你會得到一個代數表達式,形式為:
(x1 + x2 + x3 + ... + xn) * (y1 + y2 + ... + ym)
以及總共 (n + m) 個整數
你需要使用這些給定的整數來找出這個表達式的最大值與最小值
例如,若給你:
(x1 + x2) * (y1 + y2)
以及數字:1、2、3、4,那麼最大值為:
(1 + 4) * (2 + 3) = 25
最小值為:
(4 + 3) * (2 + 1) = 21
輸入說明
每筆輸入資料以兩個正整數 N 與 M 開始(N, M < 51)
接下來的一行包含 (N + M) 個整數,範圍介於 -50 到 50 之間
輸入以檔案結尾(EOF)作為結束。最多會有 110 組測資
輸出說明
對於每一組測資,請輸出一行:最大值 與 最小值(以空格分隔)
解題思路
程式碼
#include <bits/stdc++.h> using namespace std; #define int long long signed main() { int x, y; while (cin >> x >> y) { vector<int> v(x+y); int sum = 0; for (auto &i : v) { cin >> i; sum += (i += 50); } if (x > y) swap(x, y); bitset<100*100+10> dp[x+1]; dp[0][0] = 1; for (int i = 0; i < x+y; i++) for (int j = x; j >= 1; j--) dp[j] |= (dp[j-1] << v[i]); int mx = -1e9, mn = 1e9; for (int i = 0; i <= sum; i++) if (dp[x][i]) { int k = (i-x*50) * (sum-i-y*50); mx = max(mx, k); mn = min(mn, k); } cout << mx << ' ' << mn << '\n'; } }