vijos1144守皇宫43分求指点
来源:互联网 发布:矩阵计算中文第四版pdf 编辑:程序博客网 时间:2024/05/03 12:57
//都不忍心说水了QAQOwO
#include<bits/stdc++.h>
using namespace std;
struct node{
int son[1801];
int sonnum;
int price;
int fa;
}a[1501];
long long treedp[1501][2][2];
long long n;
void init()
{
cin>>n;
int num;
for(int i=1;i<=n;i++)
{
cin>>num;
cin>>a[num].price;
cin>>a[num].sonnum;
for(int j=1;j<=a[num].sonnum;j++)
{
cin>>a[num].son[j];
a[a[num].son[j]].fa=num;
}
}
}
int getfa(int x)
{
if (a[x].fa==0) return x;
else return (getfa(a[x].fa));
}
int getmin(int x,int y,int z)
{
int asjklf=min(x,y);
asjklf=min(asjklf,z);
return asjklf;
}
int dp(int x,int self,int sonif)
{
if(a[x].sonnum==0&&self) return a[x].price;
if(a[x].sonnum==0) return 24576567678768768;
if (treedp[x][self][sonif]) return treedp[x][self][sonif];
if(self&&sonif)
{
treedp[x][self][sonif]=a[x].price;
for(int i=1;i<=a[x].sonnum;i++)
{
int j=a[x].son[i];
treedp[x][1][1]+=getmin(dp(j,1,1),dp(j,0,1),dp(j,0,0));
}
}
if(!self&&!sonif)
{
for(int i=1;i<=a[x].sonnum;i++)
{
int j=a[x].son[i];
treedp[x][0][0]+=dp(j,0,1);
}
}
if(!self&&sonif)
{
int ll=a[x].son[1];
bool al=0;
long long bit=dp(ll,1,1)-dp(ll,0,1);
for(int i=1;i<=a[x].sonnum;i++)
{
int j=a[x].son[i];
long long ppg=dp(j,1,1)-dp(j,0,1);
if(ppg<=0)
{
treedp[x][0][1]+=ppg;
al=1;
}
bit=min(bit,dp(j,1,1)-dp(j,0,1));
treedp[x][0][1]+=dp(j,0,1);
}
if(!al)
treedp[x][0][1]+=bit;
}
return treedp[x][self][sonif];
}
int main()
{
init();
long long gen=getfa(1);
long long ans=min(dp(gen,0,1),dp(gen,1,1));
cout<<ans;
}
#include<bits/stdc++.h>
using namespace std;
struct node{
int son[1801];
int sonnum;
int price;
int fa;
}a[1501];
long long treedp[1501][2][2];
long long n;
void init()
{
cin>>n;
int num;
for(int i=1;i<=n;i++)
{
cin>>num;
cin>>a[num].price;
cin>>a[num].sonnum;
for(int j=1;j<=a[num].sonnum;j++)
{
cin>>a[num].son[j];
a[a[num].son[j]].fa=num;
}
}
}
int getfa(int x)
{
if (a[x].fa==0) return x;
else return (getfa(a[x].fa));
}
int getmin(int x,int y,int z)
{
int asjklf=min(x,y);
asjklf=min(asjklf,z);
return asjklf;
}
int dp(int x,int self,int sonif)
{
if(a[x].sonnum==0&&self) return a[x].price;
if(a[x].sonnum==0) return 24576567678768768;
if (treedp[x][self][sonif]) return treedp[x][self][sonif];
if(self&&sonif)
{
treedp[x][self][sonif]=a[x].price;
for(int i=1;i<=a[x].sonnum;i++)
{
int j=a[x].son[i];
treedp[x][1][1]+=getmin(dp(j,1,1),dp(j,0,1),dp(j,0,0));
}
}
if(!self&&!sonif)
{
for(int i=1;i<=a[x].sonnum;i++)
{
int j=a[x].son[i];
treedp[x][0][0]+=dp(j,0,1);
}
}
if(!self&&sonif)
{
int ll=a[x].son[1];
bool al=0;
long long bit=dp(ll,1,1)-dp(ll,0,1);
for(int i=1;i<=a[x].sonnum;i++)
{
int j=a[x].son[i];
long long ppg=dp(j,1,1)-dp(j,0,1);
if(ppg<=0)
{
treedp[x][0][1]+=ppg;
al=1;
}
bit=min(bit,dp(j,1,1)-dp(j,0,1));
treedp[x][0][1]+=dp(j,0,1);
}
if(!al)
treedp[x][0][1]+=bit;
}
return treedp[x][self][sonif];
}
int main()
{
init();
long long gen=getfa(1);
long long ans=min(dp(gen,0,1),dp(gen,1,1));
cout<<ans;
}
2 0
- vijos1144守皇宫43分求指点
- vijos1144小胖守皇宫 [树规]
- vijos1144.小胖守皇宫(树形DP)
- 小胖守皇宫 vijos1144 树形dp
- CCF201503(1-3)3仅90分,求指点
- 求指点
- 求指点
- 求指点
- 求高手指点
- 求高手指点
- 求高手指点
- 菜鸟求高手指点
- 求高手指点
- 求高人指点!
- 求指点!!数据挖掘!
- 求大侠指点方向
- 求高手指点
- 求高手指点!!!!
- zookeeper原理(转)
- 集成点:网关、隧道及中继
- SVM支持向量机原理(二) 线性支持向量机的软间隔最大化模型
- python 数据分析环境安装
- wordpress源码解析-数据库表结构(2)
- vijos1144守皇宫43分求指点
- 结构化查询(Query DSL)和结构化过滤(Filter DSL)
- OkHttp网络请求框架+AsyncTask自动解析
- opencv的机器学习的bug
- Spark修炼之道(进阶篇)——Spark入门到精通:第十四节 Spark Streaming 缓存、Checkpoint机制
- hdu 2923 Floyd
- 链表删除框架原理释义
- android实现定位与目的地的导航
- Android 主线程与子线程之间消息传递