簡要題意:給定對空和對艦的飛機還有乙個航母,給定計算公式,要你弄個奇怪的方案。
題意非常扭曲,但是的確算是個好題吧。對於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...