思路:一開始以為是可以暴搜的,然後發現只過了50的樣例,後來才知道原來是個狀壓的裸題。
先用floyd預處理每個點之間的最短路,然後對於要去的地方(最多15個,所以是狀態最多不到32768)進行狀壓。
#include
using
namespace
std;
const
int inf = 0x3f3f3f3f;
const
int maxn = 205;
int e[maxn][maxn];
int n, m, r;
int reach[maxn];
int vis[maxn];
int ans = inf;
int dp[50000][20];
int main()
for(int i = 1; i <= n; i++) e[i][i] = 0;
for(int i = 1; i <= m; i++)
for(int k = 1; k <= n; k++) }}
memset(dp, inf, sizeof(dp));
for(int i = 0; i < r; i++) dp[1
<< i][i + 1] = 0;
for(int s = 0; s < (1
<< r); s++) }}
int min = inf;
int s = (1
<< r) - 1;
for(int i = 1; i <= r; i++) min = min(min, dp[s][i]);
printf("%d\n", min);
return
0;}
牛客網小白月賽D
題目 水果店裡有 n個水果排成一列。店長要求顧客只能買一段連續的水果。小陽對每個水果都有乙個喜愛程度 ai,最終的滿意度為他買到的水果的喜歡程度之和。如果和為正 不管是正多少只要大於 0 即可 他就滿意了。小陽想知道在他滿意的條件下最多能買多少個水果。你能幫幫他嗎?輸入描述 第一行輸入乙個正整數 n...
牛客網 小白月賽 D題
位運算是乙個非常重要的東西。而小a最近在學習位運算,小a看到了一道很簡單的例題,是說從n個數裡面選出n 1個數要讓它們或起來的值最大,小a想知道這個答案是多少。你可以幫幫他嗎?輸入描述 第一行乙個整數n表示有n個數接下來一行n個數表示a1,a2 an第一行乙個整數n表示有n個數接下來一行n個數表示a...
牛客小白月賽13 D題
位運算是乙個非常重要的東西。而小a最近在學習位運算,小a看到了一道很簡單的例題,是說從n個數裡面選出n 1個數要讓它們或起來的值最大,小a想知道這個答案是多少。你可以幫幫他嗎?思路 預處理了一下字首l陣列和字尾r陣列,然後列舉那個不選的數就可以了,每次更新ans max ans,l i 1 r i ...