zoukankan      html  css  js  c++  java
  • UVa 10131: Is Bigger Smarter?

    动态规划题。类似UVa103 Stacking Box,都是题目给一种判断嵌套的方法然后求最长序列。提前对数据排序可以节省一些时间开销。

    我的解题代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    using namespace std;
    
    #define MAXN 1005
    int N;
    int w[MAXN],s[MAXN];
    int Rank[MAXN],Index[MAXN],NextInSeq[MAXN],LongLen[MAXN];
    int cmp(const void *a, const void *b)
    {
    	int ai = *(int *)a, bi = *(int *)b;
    	if(w[ai]!=w[bi]) return w[ai]-w[bi];
    	return s[bi]-s[ai];
    };
    int dp(int n)
    {
    	if(LongLen[n]) return LongLen[n];
    	int k = Index[n];
    	for(int i=k+1; i<N; i++) if(w[n]<w[Rank[i]] && s[n]>s[Rank[i]]) if(LongLen[n]<dp(Rank[i]))
    	{
    		LongLen[n] = dp(Rank[i]);
    		NextInSeq[n] = Rank[i];
    	}
    	return ++LongLen[n];
    }
    int main()
    {
    	N=0;
    	while(scanf("%d %d",&w[N],&s[N])==2) N++;
    	for(int i=0; i<N; i++) Rank[i] = i;
    	qsort(Rank,N,sizeof(int),cmp);
    	for(int i=0; i<N; i++) Index[Rank[i]] = i;
    	memset(LongLen,0,sizeof(LongLen));
    
    	int anslen = 0, ansi;
    	for(int i=0; i<N; i++) if(anslen<dp(i)) { anslen = dp(i); ansi = i; }
    	printf("%d
    %d
    ",anslen,ansi+1);
    	for(int i=1; i<anslen; i++) { ansi = NextInSeq[ansi]; printf("%d
    ",ansi+1); }
    	return 0;
    }


  • 相关阅读:
    详解Redis中两种持久化机制RDB和AOF(面试常问,工作常用)
    IDEA链接数据库自动生成实体类
    urllib的高级用法
    django项目部署上线
    Git 远程仓库(Github)
    git 标签
    git分支管理
    Git 工作区、暂存区和版本库
    git介绍及安装
    Python3-笔记-numpy学习指南-002-基础
  • 原文地址:https://www.cnblogs.com/riskyer/p/3278038.html
Copyright © 2011-2022 走看看