4516-jsoi潛入行動
極其毒瘤的樹dp。。
空間卡的死死的,導致ll精度問題。
思路也很難想,實現起來還有很多意想不到的坑點。。
樹形dp列舉邊界一旦寫錯複雜度會假...
另需要開乙個臨時陣列儲存當前節點根據已經遍歷的子節點更新之後的dp值,dp的時候前面的狀態不能保留,要開乙個臨時陣列g更新
dp轉移可以認為是用(考慮了前i個子節點的以now為根,選取j個點放置監視器+後兩維狀態)(也就是dp[now][j][0/1][0/1])的方案數*(以son為子節點,選取k個點放置監視器+後兩維狀態)的方案數,來更新dp[now][j+k][0/1][0/1]的值。前乙個方案數可能會被覆蓋更新。
沒有滾動優化掉i的話大概是五維的dp,照luogu上的限制早mle炸了...
#include using namespace std;
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
#define debugg(x) cout<<#x<<'='<#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define dwn(i, a, b) for (int i = (a); i >= (b); --i)
#define mod (ll)(1e9+7)
#define mid ((lo+ro)>>1)
void fre()
void fc()
const int maxn=1e5+10;
const ll inf=0x7fffffff;
int n, m;
int dp[maxn][110][2][2];
int tmp[110][2][2];
vectorall[maxn];
void add(int u, int v)
inline int add1(int x, ll y)
int dfs(int now,int fat)
rep(j, 0, min(sum, m))
}sum+=t;
}return sum;
}int main()
dfs(1, 0);
cout << ((dp[1][m][1][1] + dp[1][m][0][1]) % mod) << endl;
return 0;
}
JSOI2018 潛入行動
題目 我好菜啊,嚶嚶嚶 原來本地訪問陣列負下標不會報 re 或者 wa 甚至能跑出正解啊 這道題還是非常呆的 我們發現 k 很小,於是斷定這是乙個樹上揹包 發現在乙個點上安裝控制器並不能控制這個點,可能需要到父親那邊才能控制這個點,於是我們設 dp i j 0 1 0 1 表示在以 i 為根的子樹裡...
JSOI2018 潛入行動
一棵 n n le10 5 個結點的樹,在一些點上安裝 k k le min n,100 個裝置。每個裝置可以控制所有與安裝位置相鄰的結點 不包括本身 每個點可以安裝至多乙個裝置。問有多少種方案恰好用完 k 個裝置,使得所有的結點都被控制。樹形dp。f i j 0 1 0 1 表示以 i 為根的子樹...
JSOI2018 潛入行動
題目鏈結 參考題解 注意題面 在當前節點設定監聽裝置不能監聽到節點本身。那麼節點能否被覆蓋和節點是否設定監聽裝置需要分開設。設 f 表示以第 i 個節點為根的子樹,除了 i 以外的節點都已經被覆蓋,i 號節點有沒有設定監聽裝置 有沒有被覆蓋的方案數。轉移方程 f sum f f f sum f f ...