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

[HDU] 1054 Strategic Game 入门树形DP

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1054

方法:一个节点选了,则其直接子节点可选可不选,一个节点没有选,则直接子节点必须选,所以建议状态转移方程设

F(P,0)为没有选择p点最少要用多少点,

F(P,1)为选择p点最少要用多少点

      {

      sum({F(S,1)|S是p的直接子节点});P为非叶子

F(P,0)=

      0;P为叶子

      },

      {

      sum({  min(F(S,1),F(S,0)) |S是p的直接子节点 })+1;P为非叶子

F(P,1)=

      1;P为叶子

      }

原来问题的解是min(F(root,1),F(root,0)).

注意这种输入方式如何确定root

代码:

#include <iostream>
#include <queue>
#include<algorithm>
using namespace std;
int n,m,MAX=1600;
bool map[1501][1501];
struct Arc
{
    int vetex;
    Arc* nextArc;
};
struct Node
{
    int x;
    int inDegree;
    Arc* firstArc;
    int layer;
	int noChose;
	int chose;
};
Node nodes[1501];
void createArc(int s,int e)
{
    Arc* arc = (Arc*)malloc(sizeof(Arc));
    arc->vetex=e;
    if(nodes[s].firstArc==NULL)
        arc->nextArc=NULL;
    else
        arc->nextArc=nodes[s].firstArc;
    nodes[s].firstArc = arc;
}
int treeDP[2000][2];
int myMin(int x,int y)
{
    return x>y ? y:x;
}
void treeDp(int root)
{
	Arc* arc = nodes[root].firstArc;
	int v,sonCount=0;
	while(arc!=NULL)
	{
		v=arc->vetex;
		treeDp(v);
		nodes[root].noChose += nodes[v].chose;
		nodes[root].chose += myMin(nodes[v].chose,nodes[v].noChose);
		arc=arc->nextArc;
		sonCount++;
	}
	if(sonCount == 0)
	{
		nodes[root].noChose = 0;  
		nodes[root].chose = 1;
	}
}
void main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(treeDP,0,sizeof(treeDP));
        for(int i=0;i<n;i++)
        {
            nodes[i].inDegree=0;
            nodes[i].firstArc=NULL;
			nodes[i].noChose = 0;
			nodes[i].chose = 1;
        }
        for(int i=0;i<n;i++)
        {
            char str[20];
            cin>>str;
            int number=0,posLeft,count=0;
            for(int i=0;i<::strlen(str);i++)
            {
                if(str[i]==':')
                {
                    int seed =1;
                    for(int k =i-1;k>=0;k--)
                    {
                        number+=(seed*(str[k]-'0'));
                        seed*=10;
                    }
                }
                if(str[i]=='(')
                    posLeft=i;
                if(str[i]==')')
                {
                    int seed =1;
                    for(int k = i-1;k>posLeft;k--)
                    {
                        count+=(seed*(str[k]-'0'));
                        seed*=10;
                    }
                }
            }
            nodes[number].x=number;
            for(int y=0;y<count;y++)
            {
                int son;
                cin>>son;
                nodes[son].x=son;
                nodes[son].inDegree++;
                createArc(number,son);
            }
        }

        for(int i=0;i<n;i++)
        {
            if(nodes[i].inDegree==0)
            {
                nodes[i].layer=0;
                treeDp(i);
				cout<<myMin(nodes[i].noChose,nodes[i].chose)<<endl;
                break;
            }
        } 
    }
}

 感想:入门水题

转载于:https://www.cnblogs.com/kbyd/p/3243182.html

相关文章:

  • JS Invalid Label ,eval错误解决方法
  • A2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)
  • boost库在工作(37)网络UDP服务端之七
  • H面试程序(0):字符串一些常用函数的实现
  • 不容易系列之(4)——考新郎[HDU2049]
  • 正则表达式介绍
  • hdu 1029
  • SQL server经验分享:SQLSERVER 被标记为“可疑”的数据库处理方法
  • 代码自动生成工具MyGeneration之一(程序员必备工具)
  • ASP.NET中利用Split实现对Checkbox的字符串分离放到DataTable里面
  • Git基本操作(add,commit的理解)
  • 怎么编写测试驱动程序
  • 百度地图 - 合并模拟器和真机的静态库文件
  • vb常用命名空间
  • Java解析xml配置文件合成器
  • ----------
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • AWS实战 - 利用IAM对S3做访问控制
  • Elasticsearch 参考指南(升级前重新索引)
  • EventListener原理
  • JSDuck 与 AngularJS 融合技巧
  • js递归,无限分级树形折叠菜单
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • supervisor 永不挂掉的进程 安装以及使用
  • Travix是如何部署应用程序到Kubernetes上的
  • 搭建gitbook 和 访问权限认证
  • 关于extract.autodesk.io的一些说明
  • 基于webpack 的 vue 多页架构
  • 面试遇到的一些题
  • 前端性能优化——回流与重绘
  • 如何胜任知名企业的商业数据分析师?
  • 我的zsh配置, 2019最新方案
  • 我的面试准备过程--容器(更新中)
  • 一个SAP顾问在美国的这些年
  • 自定义函数
  • 走向全栈之MongoDB的使用
  • HanLP分词命名实体提取详解
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 从如何停掉 Promise 链说起
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 选择阿里云数据库HBase版十大理由
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • !$boo在php中什么意思,php前戏
  • $L^p$ 调和函数恒为零
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (三)uboot源码分析
  • (转)程序员疫苗:代码注入
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 中什么样的类是可使用 await 异步等待的?