uva:10131 - Is Bigger Smarter?

本文介绍了一种解决最长上升子序列问题的动态规划算法实现,并通过具体代码示例展示了如何处理特定输入数据,包括排序输入序列和追踪最长序列中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1072

简单dp,是最长上升子序列问题的变种。要注意样例,对于其输出结果,得到得先将输入的序列进行排序,然后再动规。由于要输出对应的序列号,所以这里我们就直接采用O(n^2)算法。由于输出的序列是按照给定的要求的,所以这里我们可以从数组尾进行动规计算,然后不断的记录一个节点的下一个节点。这点与前一个动规的输出相似。代码如下:

/*
ID: csuchenan
PROG: 10131 - Is Bigger Smarter?
LANG: C++
*/

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std ;

struct Node
{
	int w ;
	int s ;
	int index ;
}node[1005]   ;

int dp[1005]  ;//用于存储结果
int pr[1005]  ;//用于对应的前驱点

int n ;

int cmp(const void * a , const void * b)
{
	Node * c = (Node *)a ;
	Node * d = (Node *)b ;
	
	if(c->w!= d->w)
		return c->w - d->w ;
	return c->s - d->s ;	
}

int main()
{
//	freopen("10131.in" , "r" , stdin) ;
//	freopen("10131.out" , "w" , stdout) ;
	
	int i ;
	i = 0 ;
	
	n = 0 ;
	
	while(cin>>node[i].w>>node[i].s)
	{
		node[i].index = i + 1 ; 
		i++ ;
	}
	
	n = i ;
	
	//先进行排序 
	qsort(node , n ,sizeof(node[0]) , cmp) ;
	
	int j ;
	int temp  ;
	int index ;
	
	memset(dp , 0 , sizeof(dp)) ;
	memset(pr , 0 , sizeof(pr)) ;
	
	dp[n - 1] = 1  ;
	pr[n - 1] = -1 ;
	
	for(i = n - 2 ; i >= 0 ; i --)
	{
		temp = 0   ;
		index = -1 ;
		
		for(j = n - 1 ; j > i ; j --)
		{
			if(temp < dp[j] && node[i].w < node[j].w && node[i].s > node[j].s)
			{
				temp = dp[j] ;
				index = j ;
			}
		}
		
		dp[i] = temp + 1 ;
		pr[i] = index ;
	}
	
	j = 0 ;
	for(i = 1  ; i < n ; i ++)
	{
		if(dp[i] > dp[j])
			j = i ;
	}
	
	cout<<dp[j]<<endl ;
	
	
	while(j!=-1)
	{
		cout<<node[j].index<<endl ;
		j = pr[j] ;
	}

	return 0 ;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值