hdu5909-Tree Cutting(树形dp)
偷偷抄bestcoser上面hnust_zhaozhixuan的代码 = = 因为题解看不懂阿
#include <cstdio> #include <cstring> typedef long long ll; using namespace std; const int N = 1500; const int MOD = 1e9 + 7; int Scan() { int x = 0, f = 1; char ch = getchar(); while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); } while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + ch - '0'; ch = getchar(); } return x * f; } struct Edge { int to, next; } edge[N*2]; int head[N], cntE; void addedge(int u, int v) { edge[cntE].to = v; edge[cntE].next = head[u]; head[u] = cntE++; edge[cntE].to = u; edge[cntE].next = head[v]; head[v] = cntE++; } int a[N], n, m; int sz[N]; // sz[u] 记录 根为 u 点 有多少个异或值 int val[N][N]; // val[u][i] 记录 u 点 第 i 个的异或值都是什么 int dp[N][N]; // dp[u][i] 记录 根为 u 点 异或值为i的数量 int vis[N][N]; // vis[i] 记录 i 这个 异或值是否出现过 int tmp[N]; void add(int &a, int b) { a = ((ll)a + b) % MOD; } void dfs(int u, int fa) { dp[u][ a[u] ] = 1; val[u][ sz[u]++ ] = a[u]; vis[u][ a[u] ] = true; for (int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].to; if (v == fa) continue; dfs(v, u); memset(tmp, 0, sizeof(int)*m); for (int j = sz[u]-1; j >= 0; --j) { for (int k = 0; k < sz[v]; ++k) { int a = val[u][j], b = val[v][k]; add(tmp[a^b], (ll)dp[u][a] * dp[v][b] % MOD); if (!vis[u][a^b]) val[u][sz[u]++] = a^b, vis[u][a^b] = true; } } for (int j = 0; j < m; ++j) add(dp[u][j], tmp[j]); } } void init() { memset(head, -1, sizeof(int)*(n+2)); memset(sz, 0, sizeof(int)*(n+2)); for (int i = 0; i <= n; ++i) memset(dp[i], 0, sizeof(int)*m), memset(vis[i], 0, sizeof(int)*m); cntE = 0; } int main() { //freopen("in.txt", "r", stdin); int T = Scan(); while (T--) { n = Scan(), m = Scan(); init(); for (int i = 1; i <= n; ++i) a[i] = Scan(); for (int i = 1; i < n; ++i) addedge(Scan(), Scan()); dfs(1, 0); for (int k = 0; k < m; ++k) { int ans = 0; for (int i = 1; i <= n; ++i) add(ans, dp[i][k]); printf("%d%c", ans, k==m-1?'\n':' '); } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-10-02 UVALive 5111 Soccer Teams (动态规划)