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

做网站大php 网站缩略图

做网站大,php 网站缩略图,代做企业网站备案,wordpress主题制作视频教程这类题型在 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.yayakq.cn/news/299013/

相关文章:

  • 巴中微网站建设网站seo关键词排名查询
  • 江苏省教育网站官网工程建设服务平台
  • 西乡网站开发天眼查个人查询入口
  • 怎么看一个网站是由哪个网络公司做的免费软件app下载大全正能量网站
  • wordpress 黄蓝 现代企业广州seo搜索
  • 企业网站建设基本流程wordpress 前台编辑
  • 网站流量分成windows优化大师官方下载
  • wordpress邮箱登录贵州网站建设seo优化
  • 做网站意义wordpress livechat
  • 网站cms识别桂林象鼻山地址
  • 学做网站好吗做美剧盗版网站
  • 网站开发asp.net网页上上传wordpress
  • 国内做网站上市公司wordpress 群发
  • 如何破解网站后台阿里轻云wordpress
  • 织梦网站系统中国科技成就作文
  • 上海建网站开发公建设一元云购类网站
  • 广州网站建设设计权威的网页设计公司
  • 黑龙江建设网站招聘陕西优秀的企业门户网站建设
  • 网站搭建费用价格表南宁网站建设制作
  • 网站代码优化的内容有哪些网站建设方案项目书
  • 如何用ps做网站首页新闻app开发
  • 朝阳网站开发Wordpress虚拟资源交易
  • 涞源县住房和城乡建设局网站小水库运行管理培训教材久久建筑网
  • 信息网站建设的意义试用网站建设
  • 公司要建设网站河北响应式网站建设
  • 深圳有没有维护公司网站深圳人才大市场官网招聘信息
  • 怎么弄百度网站做网站seo优化
  • 营销网站系统网络公司排名前十名有哪些
  • 网站开发好学不wordpress免费下载
  • 网站 关键词 怎么改山东东营信息网