首页 > 其他分享 >UVA - 10131 Is Bigger Smarter? 最长上升子序列

UVA - 10131 Is Bigger Smarter? 最长上升子序列

时间:2023-04-07 11:10:43浏览次数:40  
标签:10131 int Smarter ans maxn 大象 max UVA dp


题目大意:给出一系列大象的体重和IQ的数据,要求找出最长的一串,符合 大象1的体重大于大象2,而IQ却小于大象2

解题思路:设置一个状态量,d[i],表示以第i只大象为终点的符合条件的最大值,则如果符合大象i的体重大于大象j的体重,但IQ却反之且d[i]  < d[j] + 1,那么d[i]  = d[j] + 1

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 5;
struct elephant {
	int w;
	int i;
	int m;
}e[maxn];
int path[maxn],dp[maxn];

bool cmp(elephant e1,elephant e2) {
	return e1.w < e2.w ;
}

int main() {
	int k = 1;
	while(scanf("%d%d",&e[k].w,&e[k].i) != EOF) {
		e[k].m = k;
		k++;	
	}
	k--;
	sort(e+1,e+k,cmp);

	for(int i = 1; i <= k; i++) {
		dp[i] = 1;
		path[i] = i;
	}

	int first,max = -1;	

	for(int i = 1; i <= k; i++)
		for(int j = 1; j < i ;j++) {
			if(e[i].w > e[j].w && e[i].i < e[j].i && dp[i] < dp[j]+1) {
					dp[i] = dp[j] + 1;
					path[i] = j;	
			}
			if(max < dp[i]) {
				max = dp[i];
				first = i;	
			}
		}

	printf("%d\n",max);
	int i = first ;
	int ans[maxn],count = 0;
	while(max--) {
		ans[count++] = e[i].m;	
		i = path[i];
	}
	for(int i = count-1; i >= 0; i--)
		printf("%d\n",ans[i]);
	return 0;
}



标签:10131,int,Smarter,ans,maxn,大象,max,UVA,dp
From: https://blog.51cto.com/u_10970600/6175553

相关文章

  • UVA - 674 Coin Change 经典问题
    题目大意:给出5中硬币,分别是1,5,10,25,50,然后给你一个数字,能由这五种硬币组成的方式有多少种解题思路:解法一:硬币按小到大排,用j表示还有能用几种硬币表示,则当j==0时,则表示所剩下的值可以用n个1来表示,具体看代码#include<cstdio>constintmaxn=7500;intcoin[5]={1,5,10,25,50};in......
  • UVA - 757 Gone Fishing 贪心+枚举
    题目大意:有n个湖泊,每个湖泊最初的5分钟能钓到f条鱼,每五分钟减少d条鱼,鱼的数目不能小于d也不能为负数,求在h小时能钓到的鱼的最大数目和在每个池塘带了多少分钟解题思路:一个个枚举,如果用总时间减去到达另一个湖泊的时间的话,就表示它可以在两个湖泊随意行走了,然后在这些时间找到优解,并......
  • UVA - 10716 Evil Straw Warts Live 贪心
    题目大意:给出一串字符串,问这串字符串是不是回文字符串,如果是的话需要移动几步解题思路:判断是不是回文,只需要判断里面的字母的个数,如果奇数字符出现超过了1个,那个这个就不是回文字符串了。接下来是移动,应该由外向里移动,不管是先移动那个字符,最后移动的步数都是一样的,所以从前往后扫......
  • UVA - 116 Unidirectional TSP 多段图的最短路
    题目大意:给出一个矩阵,要求每列都要路过,起点必须是第一列,求经过的最短路径的上面的数字和最小解题思路:公式为d[i][j]=min(d[i][j+1],d[i+1][j+1],d[i-1][j+1])+a[i][j],本题要注意,因为可以从最上面一行到最后一行,或者从最后一行到第一行,注意i的变化#include<cstdio>#include<alg......
  • UVA - 10148 Advertisement 区间取点问题
    题目大意:在一个公园里,有N个跑步者,每个跑步者都有固定的跑步范围,有个广告商要在公园里放置广告牌,要求每个广告牌至少要被每个跑步者看到K次,如果跑步者的区间不够K的要,那么在他的区间内每个点都要有广告牌解题思路:区间选点问题,先按右端从小到大排序,然后统计该区间内已经有几个广告牌......
  • UVA - 108 Maximum Sum 求子矩阵的最大和
    题目大意:给出一个矩阵,求出这个矩阵中的子矩阵的最大和解题思路:和UVA507的题目类似,只不过这次是个矩阵了,换个角度思考,将这个二维数组转换成一维数组思考,用sum存储该列的前N个数字的和,如,sum[3][1]就是第一列的前三个数字的和,这样就可以将其想象成一维的最大连续和了,在枚举行,求其最大的和......
  • UVA - 10245 The Closest Pair Problem 分治法
    题目大意:给出一系列的点,求出距离最近的两点的距离的大小,如果该距离大于10000,则输出INFINITY,如果不是的话,输出保留四个小数点的距离解题思路:如果裸的枚举的话,无疑是TLE,O(n^2)的算法既然不行的话,就换分治法试试,将其按X轴坐标的大小排序,由小到大,分别求出每部分的大小,然后进行比较,比较难......
  • UVA - 10905 Children's Game 字符串的排序
    题目大意:给出N个数字串,要求拼出有数字最大的串解题思路:用string就很好解决#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>usingnamespacestd;constintmaxn=60;stringstr[maxn];intcmp(stringa,stringb){ returna+b>b+a;}......
  • UVA - 10706 Number Sequence 子序列
    #include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintmaxn=32761;longlongS[maxn];//存放的是S1,S2,到SK的和,S[5]表示了S1到S4的和,当数字变化到K的时候,一共有多少个字数了intborder[9]={0,1,10,100,1000,10000,100000,1000000,10000000......
  • UVA - 129 Krypton Factor 回溯+剪枝
    题目大意:给出N种字母,要求用这N种字母组成一个困难的串,困难的串指在串中没有相连的两个子串相同,要求输出第M个困难的串解题思路:像八皇后一样,前面判断的就不需要再去判断了,直接往后判断即可#include<cstdio>#include<cstring>intn,L;intans[100];boolflag;intcnt;boolju......