Uva 10131 Is Bigger Smarter 最长递减子序列
2013-07-23 22:40
162 查看
这道题刚开始看到时候就知道怎么做了 然后就写啦 写的哪个代码那叫一个搓啊 排序还用冒泡 后来一看别人的都是sort 瞬间感觉自己弱爆了
分析:这道题的关键就是先排序 接着就是求最长递减子序列了(dp判断的时候一定要注意是严格的递增和递减) 答案不唯一 还要记录路径 递归找路径非常容易
下面是代码 写得还是有点搓
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 1005;
int dp[maxn],pre[maxn],str[maxn],T;
struct elephant//定义结构体
{
int w;
int s;
int num;
} st[maxn];
int cmp(elephant x,elephant y)
{
if(x.w<y.w)
{
return 1;//不交换
}
else if(x.w==y.w)
{
if(x.s>y.s)
{
return 1;
}
}
return 0;//交换
}
void printPath(int t)
{
str[T++]=st[t].num;
if(pre[t]){
printPath(pre[t]);
}
}
using namespace std;
int main()
{
int N;
for(N = 1;scanf("%d%d",&st
.w,&st
.s)==2 ; N++)
st
.num = N;
N--;
int i,j;
sort(st+1,st+N+1,cmp);
for(int i = 0; i < N; i++)
printf("%d\n",st[i].w);
memset(dp,0,sizeof(dp));//初始化dp数组
int ans = 1,temp = 0,max;
for(i=2; i<=N; i++)//dp求一个最优解
{
max = 0;
for(j=i-1; j>=1; j--)
if(st[i].s<st[j].s&&st[i].w>st[j].w&&dp[j]>max)//必须要求dp[j]中的最大值
{
max = dp[j];
pre[i]=j;//记录前驱
}
dp[i] = max+1;
}
max = 0;
for( i = 1; i <= N; i++)
if(max<dp[i]){max = dp[i];temp = i;}
printf("%d\n",max);
printPath(temp);
for(i = --T; i >= 0; i--)
printf("%d\n",str[i]);
return 0;
}
分析:这道题的关键就是先排序 接着就是求最长递减子序列了(dp判断的时候一定要注意是严格的递增和递减) 答案不唯一 还要记录路径 递归找路径非常容易
下面是代码 写得还是有点搓
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 1005;
int dp[maxn],pre[maxn],str[maxn],T;
struct elephant//定义结构体
{
int w;
int s;
int num;
} st[maxn];
int cmp(elephant x,elephant y)
{
if(x.w<y.w)
{
return 1;//不交换
}
else if(x.w==y.w)
{
if(x.s>y.s)
{
return 1;
}
}
return 0;//交换
}
void printPath(int t)
{
str[T++]=st[t].num;
if(pre[t]){
printPath(pre[t]);
}
}
using namespace std;
int main()
{
int N;
for(N = 1;scanf("%d%d",&st
.w,&st
.s)==2 ; N++)
st
.num = N;
N--;
int i,j;
sort(st+1,st+N+1,cmp);
for(int i = 0; i < N; i++)
printf("%d\n",st[i].w);
memset(dp,0,sizeof(dp));//初始化dp数组
int ans = 1,temp = 0,max;
for(i=2; i<=N; i++)//dp求一个最优解
{
max = 0;
for(j=i-1; j>=1; j--)
if(st[i].s<st[j].s&&st[i].w>st[j].w&&dp[j]>max)//必须要求dp[j]中的最大值
{
max = dp[j];
pre[i]=j;//记录前驱
}
dp[i] = max+1;
}
max = 0;
for( i = 1; i <= N; i++)
if(max<dp[i]){max = dp[i];temp = i;}
printf("%d\n",max);
printPath(temp);
for(i = --T; i >= 0; i--)
printf("%d\n",str[i]);
return 0;
}
相关文章推荐
- uva 437(最长递减子序列)
- UVA - 10131 Is Bigger Smarter? 最长上升子序列
- uva 10131(最长递增子序列)
- UVa 10285 Longest Run on a Snowboard(DP 二维最长递减子序列)
- 最长递减子序列
- POJ 1952 LITTLE SHOP OF FLOWERS(DP动归,最长递减子序列)
- poj1952求最长递减子序列和最长子序列的种数
- 计蒜客——求数组最长递减子序列
- 【动态规划】最长递增子序列代码(UVA 10131)
- 挑战练习题2.3动态规划 poj1065 Wooden Sticks 最长递减子序列
- 微软100题(47)最长递减子序列
- NYOj-79-拦截导弹(最长递减子序列)
- UVA 10635 Prince and Princess(最长上升子序列)
- UVA 10635 Prince and Princess (最长公共子序列+最长上升子序列)
- UVA 12511/CSU 1120 virus 最长公共上升子序列
- 求最长单调递减子序列
- 算法:递归解序列中最长递减子序列
- 最长递增子序列(两种时间复杂度算法及其区别)+最长递减子序列(reverse)
- 计蒜客 2017icpc南宁赛区 The Heaviest Non-decreasing Subsequence Problem 最长不递减子序列
- 动态规划——数组中最长递减子序列