hiho 1271 艦隊遊戲 狀壓dp 貪心 模擬

2021-07-10 08:13:23 字數 1918 閱讀 1331

簡要題意:給定對空和對艦的飛機還有乙個航母,給定計算公式,要你弄個奇怪的方案。

題意非常扭曲,但是的確算是個好題吧。

對於30

% 的資料,可以進行搜尋,列舉每個位置放哪個飛機。

對於大資料可以採用狀壓dp的方式。

最多16

個位置,狀態空間為216

。由於題目中的限制,你無法直接去算整個結果。

可以分別計算兩邊的最大值然後再進行乙個最後的判斷。dp

[i][

j]表示前

i 個對?飛機,位置使用狀況為

j的最大對?傷害。

搞完之後根據題目之中的條件進行乙個判斷就可以了。

需要注意的是如果直接這麼做還是無法通過所有資料的。

可以發現任何位置對同種的傷害越大越好

於是可以排序,只留下最大的n×

m 個對空,對艦的然後去做。

開始直接搞,沒貪心各種wa,tle一晚上,第二天醒來就想明白了。

題目本身還是非常不錯的,**量還是有點長。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fi first

#define se second

using

namespace

std;

typedef

long

long ll;

typedef pair pii;

typedef pairpll;

// head

const

int n = 10;

const

int t = 1005;

const

int m = 1

<< 16;

const

int inf = -1;

int a[n][n];

vector

b, c;

vector

d;int dp[2][m];

int res[2][m];

bool exist = false;

bool yes = false;

int ans = 0;

int n, m, t, s, tt, x, nm, mx;

bool ck(int st)

}for (int i = 0; i < n; i++)

return

true;

}void getres(int *tar, const

vector

&v)

void solve()

if (ck(cur))

}}void input(vector

&b)

sort(b.begin(), b.end());

reverse(b.begin(), b.end());

while (b.size() > d.size())

}int main()

}input(b);

input(c);

exist = yes = false;

ans = 0;

solve();

if (!exist) else

d.clear();

b.clear();

c.clear();

}return

0;}

codevs1358棋盤遊戲 狀壓dp

時間限制 1 s 空間限制 64000 kb 題目等級 大師 master 這個遊戲在乙個有10 10個格仔的棋盤上進行,初始時棋子位於左上角,終點為右下角,棋盤上每個格仔內有乙個0到9的數字,每次棋子可以往右方或下方的相鄰格仔移動,求一條經過數字之和最小且經過0到9的所有數字的合法路徑,輸出其長度...

每日一題之 hiho1048 狀壓dp

程式設計之美的課後題也有乙個和整個題目一樣的。p269 題目這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓...

狀壓DP例題(種花小遊戲 廣場鋪磚)

狀態壓縮其實就是用特殊的方法來表示複雜的狀態做dp,這種特殊的方法一般是位運算。例題一 種花小遊戲 dpi j i可以拆分成二進位制數,每一位上的0或1表示是否走過,j表示當前位置。include using namespace std const double maxn 200000000.0 d...