題目鏈結 gold miner
目標是要在規定時間內獲得的價值總和要盡可能大。
我們先用並查集把斜率相同的物品分在同乙個組。
這些組裡的物品按照y座標的大小公升序排序。
如果組內的乙個物品被選取了,那該組排在他前面的所有物品肯定被選取了。
那麼我們對每個組的所有物品,對價值和代價分別求字首和。
那麼選了3號,就相當於選了1,2,3號。
這個時候問題就轉化為分組揹包了。
也就是說把物品轉換後,這個組內我最多只能選1個物品。
然後就很簡單了。
#include using namespace std;#define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
typedef long long ll;
const int n = 205;
struct node a[n];
int father[n], used[n], c[n], f[n], g[n], dp[n * n];
int n, t, cnt, et, ca = 0;
vector v[n];
int getfather(int x)
bool cmp(int p, int q)
int main()}}
} rep(i, 1, n) c[i] = getfather(i);
rep(i, 0, n + 1) v[i].clear();
cnt = 0;
memset(used, 0, sizeof used);
rep(i, 1, n)
else
} rep(i, 1, cnt) if ((int)v[i].size() > 1) sort(v[i].begin(), v[i].end(), cmp);
memset(dp, 0, sizeof dp);
rep(i, 1, cnt)
}} printf("case %d: %d\n", ++ca, dp[t]);
} return 0;
}
hdu4341 Gold miner 分組揹包dp
題意 和 礦工差不多。人在 0,0 有n種金,遊戲時間為t。告訴你每種金的位置 x,y 獲得該金需要的時間的t,以及它的 價值。且若人和多塊金子共線時,只能先取最近的金子。問在遊戲時間內可獲得最大價值。思路 對於共線的金,我們將其分為一組,並按照距 0,0 的距離排序,那麼選該點的價值為前面所有的價...
HDU 4341 Gold miner 分組揹包
這裡有多個點與原點的連線共線的話,那麼需要對其進行並組,將前乙個作為單獨的乙個,把前兩個作為單獨的乙個.最後直接分組揹包就可以了。如下 include include include include define maxn 205 using namespace std intn,m,cnt max...
HDU 4341 Gold miner 分組揹包
這裡有多個點與原點的連線共線的話,那麼需要對其進行並組,將前乙個作為單獨的乙個,把前兩個作為單獨的乙個.最後直接分組揹包就可以了。如下 include include include include define maxn 205 using namespace std intn,m,cnt max...