当前位置: 首页 > news >正文

微信网站建设报价单竞价推广招聘

微信网站建设报价单,竞价推广招聘,广州建网站公司排名,百度云搜索引擎官网这类题型在 dp 中很常见,于是做一个总结吧!!! 最经典的题:没有上司的舞会 传送门:没有上司的舞会 - 洛谷 状态表示: dp[i][0] 为 以 i 为根的子树中,选择 i 节点的最大欢乐值 d…

这类题型在 dp 中很常见,于是做一个总结吧!!!

最经典的题:没有上司的舞会

传送门:没有上司的舞会 - 洛谷

状态表示:

dp[i][0] 为 以 i 为根的子树中,选择 i 节点的最大欢乐值

dp[i][1] 为 以 i 为根的子树中,不选择 i 节点的最大欢乐值

状态转移方程  dp[i][0] += dp[[j][1]        dp[i][1] += dp[j][0]      j 为 i 的子节点

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 6e3 + 10;
int a[N];
int h[N], e[N], ne[N], idx;
bool flag[N] = { 0 };
int f[N][2];
void add(int a, int  b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
void dfs(int u , int fa ) // 树形 dp 中一般都是用 dfs
{for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];dfs(j, u);f[u][0] += max(f[j][0] , f[j][1] );f[u][1] += f[j][0];}
}
void solve()
{memset(h, -1, sizeof h);int n; cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i < n; i++){int a, b;cin >> a >> b;add(b, a);flag[a] = true;}int root = -1;for (int i = 1; i <= n; i++){f[i][1] += a[i];if (!flag[i]) root = i;}dfs(root, -1 );cout << max (f[root][1], f[root][0]) << endl;
}
signed main()
{int tt = 1;while (tt--)solve();return 0;
}

再来一道经典题目:选课 (树形dp 点)

传送门:[CTSC1997] 选课 - 洛谷

状态表示:

dp[i][[j] 以 i 为根的子树中,选择 j 个节点的最大学分

状态转移方程:

 dp[i][j] = dp[i][j - k] + dp[t][k] ( t 为 j 的子节点 ,k 是从子树中选择 k 个节点 )

注意:

1.你要统计子树中节点的个数

2. 需要假设一个虚拟源节点,因此要把 m++

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 620;
int f[N][N]; int n, m;
int h[N], e[N], ne[N], idx, score[N];
int Size[N];
void add(int a, int b)
{e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}
void dfs(int u, int fa)
{Size[u] += 1;f[u][1] += score[u];for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (j == fa)continue;dfs(j, u);Size[u] += Size[j];for (int t = min(m, Size[u]); t; t--) // 注意 t 要从大到小遍历// 如果 t 要从小到大遍历,就会导致当 t 变大时,更新最新状态时,会用到这个子树刚刚更新的状态{for (int k = min(Size[j], t - 1); k >= 0; k--){f[u][t] = max(f[u][t], f[u][t - k ] + f[j][k] );}}}
}
signed main()
{memset(h, -1, sizeof h);cin >> n >> m;m++;for (int i = 1; i <= n; i++){int x; cin >> x; add(i, x); add(x, i);cin >> score[i];}dfs(0, -1);cout << f[0][m] << endl;return 0;
}

经典题目:二叉苹果树(树形dp 边)

传送门:https://www.luogu.com.cn/problem/P2015

状态表示:dp[i][j] 以 i 为根的子树中,保留 j 条边的最多苹果树

这道题有一个隐含的条件,当某条边被保留下来时,从根节点到这条边的路径上的所有边也都必须保留下来

状态转移方程:

dp[i][j] = max( dp[i][j] , dp[i][j-k-1] + dp[t][k] + w[i] ) ( t 为子节点,k是值子树中选择 k 条边)

注意这个题要统计子树中边的条数

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 220;
int f[N][N];
int h[N] , e[N] , ne[N] , idx , w[N];
int Size[N];
int n , m;
void add( int a , int b , int c )
{w[idx] =c ; e[idx] = b; ne[idx] = h[a] ; h[a] = idx++;
}
void dfs( int u , int fa )
{for( int i = h[u] ; i != -1 ; i = ne[i] ){int j = e[i];if( j == fa )continue;dfs( j , u );Size[u] += Size[j] + 1;for( int t = min( Size[u] , m ) ; t  ; t-- ){for( int k = min(Size[j] , t - 1 ) ; k >= 0 ; k-- ){f[u][t] = max( f[u][t] , f[u][t-k-1] + f[j][k] + w[i] );}}}
}
signed main()
{memset( h , -1 , sizeof h );cin >> n >> m;for( int i = 0 ; i < n - 1; i ++){int a , b , c; cin>> a >> b >> c;add( a , b ,c  );add( b , a , c );}dfs( 1 , -1 );cout << f[1][m] << endl;return 0;
}

http://www.dinnco.com/news/71899.html

相关文章:

  • 内蒙网站建设seo优化长春seo网站排名
  • 怎么做微信公众号免费电影网站百度网盘客服在线咨询
  • 纯净水企业怎样做网站软文标题和内容
  • 瑞诺国际做外贸网站好吗网络营销有哪些推广方式
  • 网站制作网站建设长沙官网seo收费标准
  • 摩洛哥网站后缀360站长
  • wordpress 漂亮主题西安网站seo排名优化
  • 网站开发设计公司seo推广教学
  • 湛江cms建站系统问卷调查网站
  • asp网站制作软件百度快照替代
  • 怎么做送餐网站成品网站1688入口网页版
  • 去除 做网站就用建站之星深圳短视频seo教程
  • 免费网站制作公司亚洲精华国产精华液的护肤功效
  • 做垃圾网站可行吗最厉害的搜索引擎
  • 找网站做q币优化英文
  • 做网站建设出路在哪里长沙靠谱seo优化价格
  • 网站密码如何找回全网营销推广
  • 辽宁省住房和建设厅网站公关公司提供的服务有哪些
  • 企业网络规划和设计方案太原seo哪家好
  • 12个优秀平面设计素材网站查询网站流量的网址
  • 做网站优化的协议书本周国内新闻
  • 用什么做网站郑州seo顾问外包
  • 网站开发心路历程seo站长工具平台
  • 美橙网站建设怎么做百度官方网站下载
  • 宁波制作网站哪个好短视频营销案例
  • 怎么样注册公司流程和费用搜索引擎优化是什么意思
  • 怎么加快网站打开速度宜昌网站seo收费
  • 在百度上免费做网站页面seo技术培训机构
  • 企业网站公安备案武汉网站seo德升
  • 怎么做qq钓鱼网站吗北京搜索引擎推广公司