Hrbust 1683/Hdu 4340 Alice和Bob的国家【树型Dp+思维】

解决一个关于两人合作占领由多个城市组成的国家的问题,通过树形DP算法找到最短时间。

Alice和Bob的国家
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 20(7 users)Total Accepted: 4(4 users)Rating: Special Judge: No
Description
Alice和Bob想去一起占领国家,这个国家有n个城市,为了去占据城市i,Alice需要花费A[i]分钟占领它,
Bob需要花费B[i]分钟占领它。由于城市之间有相连关系,如果城市i和城市j是邻城。如果Alice已经占据了
城市i,那么Alice去占据城市j的时间就是A[j]/2。如果j和z也是邻城那么Alice去占据z的时间也是A[z]/2。
对于Bob是同样的。我们定义占据一个国家的时间就是指将这个国家的所有城市占领。现在我们想知道Alice
和Bob一起将这个国家占领所需要的最少时间。(如果一个国家被Alice就不需要被Bob占领了)。
题目保证一个城市到另一个城市有且只有一条道路。
Input
第一行是一个整数T代表测试数据组数
对于每组测试数据第一行是一个整数N(0<N<100)代表城市数量,第二行是N个整数代表A[1],A[2]...A[N]。
第三行是N个整数代表B[1],B[2]....B[N]。接下来N-1行,每行两个整数x,y(代表x和y相连)。
Output
对于每组测试数据,输出占领一个国家的最少时间。
Sample Input
1
3
1 2 5
3 8 1
1 2
1 3
Sample Output
3
Author
陈禹@HRBUST

思路(思路及代码参考自:http://blog.youkuaiyun.com/lvshubao1314/article/details/43529927):


求最优解,而且是在一棵树上,那么考虑树型Dp.

我们设定Dp【i】【2】【2】:

①Dp【i】【0】【0】:表示到点i,以点i为子树的根这个点是被A攻占并且其子树中不存在攻占起点(全价花费点)的最优解。

②Dp【i】【0】【1】:表示到点i,以点i为子树的根这个点是被A攻占并且其子树中存在攻占起点(全价花费点)的最优解。

③Dp【i】【1】【0】:表示到点i,以点i为子树的根这个点是被B攻占并且其子树中不存在攻占起点(全价花费点)的最优解。

④Dp【i】【1】【1】:表示到点i,以点i为子树的根这个点是被B攻占并且其子树中存在攻占起点(全价花费点)的最优解。


那么状态转移方程:


Dp【u】【0】【0】=a【u】/2+Σmin(Dp【v】【0】【0】,Dp【v】【1】【1】);

这里设定x1=Σmin(Dp【v】【0】【0】,Dp【v】【1】【1】);

Dp【u】【0】【1】有两种情况,一种是当前点u是全价花费点,或者是其子树的某一个点:

Dp【u】【0】【1】=Min(a【u】+x1,a【u】/2+x1+y1);

这里y1就是Dp【v】【0】【1】与min(Dp【v】【0】【0】,Dp【v】【1】【1】)的差值的最小值。

即y1=Min(dp【v】【0】【1】-min(Dp【v】【0】【0】,Dp【v】【1】【1】));

其实每一个差值都是一个半价点变成全价点的花费。这里取最小即最优。

 

另外Dp【u】【1】【0】和Dp【u】【1】【1】与上述同理。


Ac代码:


#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
vector<int>mp[150];
int a[150];
int b[150];
int dp[150][2][2];
void Dfs(int u,int from)
{
    int flag=0;
    int x1=0,x2=0;
    int y1=0x3f3f3f3f,y2=0x3f3f3f3f;
    for(int i=0;i<mp[u].size();i++)
    {
        int v=mp[u][i];
        if(v==from)continue;
        Dfs(v,u);
        flag=1;
        x1+=min(dp[v][0][0],dp[v][1][1]);
        x2+=min(dp[v][1][0],dp[v][0][1]);
        y1=min(y1,dp[v][0][1]-min(dp[v][0][0],dp[v][1][1]));
        y2=min(y2,dp[v][1][1]-min(dp[v][1][0],dp[v][0][1]));
    }
    if(flag==0)
    {
        dp[u][0][0]=a[u]/2;
        dp[u][0][1]=a[u];
        dp[u][1][0]=b[u]/2;
        dp[u][1][1]=b[u];
        return;
    }
    dp[u][0][0]=a[u]/2+x1;
    dp[u][0][1]=min(a[u]+x1,a[u]/2+x1+y1);
    dp[u][1][0]=b[u]/2+x2;
    dp[u][1][1]=min(b[u]+x2,b[u]/2+x2+y2);
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)scanf("%d",&b[i]);
        for(int i=1;i<=n;i++)mp[i].clear();
        for(int i=1;i<=n-1;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            mp[x].push_back(y);
            mp[y].push_back(x);
        }
        Dfs(1,-1);
        printf("%d\n",min(dp[1][0][1],dp[1][1][1]));
    }
}



【论文复现】一种基于价格弹性矩阵的居民峰谷分时电价激励策略【需求响应】(Matlab代码实现)内容概要:本文介绍了一种基于价格弹性矩阵的居民峰谷分时电价激励策略,旨在通过需求响应机制优化电力系统的负荷分布。该研究利用Matlab进行代码实现,构建了居民用电行为与电价变动之间的价格弹性模型,通过分析不同时间段电价调整对用户用电习惯的影响,设计合理的峰谷电价方案,引导用户错峰用电,从而实现电网负荷的削峰填谷,提升电力系统运行效率与稳定性。文中详细阐述了价格弹性矩阵的构建方法、优化目标函数的设计以及求解算法的实现过程,并通过仿真验证了所提策略的有效性。; 适合人群:具备一定电力系统基础知识Matlab编程能力,从事需求响应、电价机制研究或智能电网优化等相关领域的科研人员及研究生。; 使用场景及目标:①研究居民用电行为对电价变化的响应特性;②设计并仿真基于价格弹性矩阵的峰谷分时电价激励策略;③实现需求响应下的电力负荷优化调度;④为电力公司制定科学合理的电价政策提供理论支持技术工具。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,深入理解价格弹性建模与优化求解过程,同时可参考文中方法拓展至其他需求响应场景,如工业用户、商业楼宇等,进一步提升研究的广度与深度。
针对TC275微控制器平台,基于AUTOSAR标准的引导加载程序实现方案 本方案详细阐述了一种专为英飞凌TC275系列微控制器设计的引导加载系统。该系统严格遵循汽车开放系统架构(AUTOSAR)规范进行开发,旨在实现可靠的应用程序刷写与启动管理功能。 核心设计严格遵循AUTOSAR分层软件架构。基础软件模块(BSW)的配置与管理完全符合标准要求,确保了与不同AUTOSAR兼容工具链及软件组件的无缝集成。引导加载程序本身作为独立的软件实体,实现了与上层应用软件的完全解耦,其功能涵盖启动阶段的硬件初始化、完整性校验、程序跳转逻辑以及通过指定通信接口(如CAN或以太网)接收验证新软件数据包。 在具体实现层面,工程代码重点处理了TC275芯片特有的多核架构与内存映射机制。代码包含了对所有必要外设驱动(如Flash存储器驱动、通信控制器驱动)的初始化与抽象层封装,并设计了严谨的故障安全机制与回滚策略,以确保在软件更新过程中出现意外中断时,系统能够恢复到已知的稳定状态。整个引导流程的设计充分考虑了时序确定性、资源占用优化以及功能安全相关需求,为汽车电子控制单元的固件维护与升级提供了符合行业标准的底层支持。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值