• HDU2452 Navy maneuvers 记忆化搜索


    这题目意思能忍?读了半年,乱七八糟的

    记忆化搜索 拖拖的,dp[i][0]代表以获得最小值为目标的船以i为起点。dp[i][1]代表以获得最大值为目标的船以i为起点。接下来暴力枚举入度为0的点为起点,開始记忆化搜索,


    const int N = 100000 + 55;
    
    int dp[N][2];
    int value[N];
    int degree[N];
    
    vector<int> G[N];
    
    int n,m,f;
    
    void init() {
    	memset(dp,-1,sizeof(dp));
    	memset(value,0,sizeof(value));
    	memset(degree,0,sizeof(degree));
    	for(int i=0;i<N;i++)G[i].clear();
    }
    
    bool input() {
    	while(cin>>n>>m>>f) {
    		for(int i=1;i<=n;i++)scanf("%d",&value[i]);
    		int q = m;
    		while(q--) {
    			int u,v;
    			scanf("%d %d",&u,&v);
    			G[u].push_back(v);
    			degree[v]++;
    		}
    		return false;
    	} 
    	return true;
    }
    
    int dfs(int pos,int mark) {
    	if(dp[pos][mark&1] != -1)return dp[pos][mark&1];
    	if(G[pos].size() == 0)return dp[pos][mark&1] = value[pos];
    	dp[pos][mark&1] = 0;
    	int maxn = -1,minn = inf;
    	for(int i=0;i<G[pos].size();i++) {
    		int v = G[pos][i];
    		if(mark&1)maxn = max(maxn,dfs(v,mark + 1));
    		else minn = min(minn,dfs(v,mark + 1));
    	}
    	int tmp = (mark&1)?maxn:minn;
    	return dp[pos][mark&1] = value[pos] + tmp;
    }
    
    
    void cal() {
    	int ans = -1;
    	for(int i=1;i<=n;i++) {
    		if(degree[i] == 0)
    			ans = max(ans,dfs(i,1));
    	}
    	if(ans < f)puts("Glory");
    	else puts("Victory");
    }
    
    void output() {
    
    }
    
    int main() {
    	while(true) {
    		init();
    		if(input())return 0;
    		cal();
    		output();
    	}
    	return 0;
    }
    


  • 相关阅读:
    DataGrip破解,汉化. 再见navicate, 再见sqlyog
    centOS安装JIRA 破解版 亲测
    centOS yum 安装 JDK
    CentOS No manual entry for xxx 没有手册文档
    idea集成JRebel热部署破解
    springboot 拦截器取不到 ajax跨域请求的header参数
    centOS安装ELK
    产品经理的”影响力“
    系统设计的一些心得
    EXIF.Js:读取图片的EXIF信息
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6919050.html
Copyright © 2020-2023  润新知