poj1952
来源:互联网 发布:域名 服务器 知乎 编辑:程序博客网 时间:2024/05/18 09:06
开始一直超时,后来发现第二层for循环写错了,下标是j--,结果写成i--了,硬是没看出来。
这一题求的最长递减子序列,算是个dp的问题。但是有个陷阱,就是可能有相同的数字
比如数字序列 8 7 6 7 5,最长的递减子序列为(8,7,5),(8,7,6),比如(8,7,5)出现了两次只能算一次,不能重复计算
可以通过如下语句排除相同的序列
else if(arr[i]==arr[j]){
if(len[i]==1)
num[i]=0;
break;
}
另外第二层循环后j从i-1开始递减,这样距离最近的相同的数字如果相同的话便不用比较了
#include<iostream>using namespace std;int lds(int *arr,int size,int &res){int max_len=1;int *len=new int[size];int *num=new int[size];res=0;for(int i=0;i<size;i++){len[i]=num[i]=1;for(int j=i-1;j>=0;j--){if(arr[i]<arr[j]){if(len[i]<len[j]+1){len[i]=len[j]+1;num[i]=num[j];}else if(len[i]==len[j]+1){num[i]+=num[j];}}else if(arr[i]==arr[j]){if(len[i]==1)num[i]=0;break;}}if(max_len<len[i])max_len=len[i];}for(int i=0;i<size;i++){if(len[i]==max_len)res+=num[i];}delete []len;delete []num;return max_len;}int main(){int res;int N;cin>>N;int *arr=new int[N];for(int i=0;i<N;i++)cin>>arr[i];int num;res=lds(arr,N,num);cout<<res<<" "<<num<<endl;delete []arr;return 0;}
- poj1952
- poj1952
- poj1952(经典dp题)
- POJ1952 BUY LOW, BUY LOWER
- POJ1952 BUY LOW, BUY LOWER
- poj1952 BUY LOW, BUY LOWER
- BUY LOW, BUY LOWER poj1952
- POJ1952 BUY LOW, BUY LOWER DP
- 【动态规划】poj1952 buy low,buy lower
- poj1952--BUY LOW, BUY LOWER题解
- POJ1952(最长下降子序列+去重)
- poj1952(BUY LOW,BUY LOWER)(dp记录方案个数)
- poj1952求最长递减子序列和最长子序列的种数
- POJ1952 BUY LOW, BUY LOWER(DP,最长下降子序列不重复计数)
- poj1952 BUY LOW, BUY LOWER(最长递减子序列及个数)
- 多线程——让多核CPU单核运行
- 让source insight支持C++源文件*.cc
- javaweb项目编码配置
- 千兆网线序定义
- 耐力---持久力
- poj1952
- SQL XML 类型插入操作
- QT中文显示解决
- POJ 3752 字母旋转游戏
- ACM俱乐部练习-A+B 输入输出练习VI
- 关于C++ const 的总结
- windows + mygwin + eclipse 配置过程
- VB 执行其他程序并等待其结束
- ZOJ 1101 Gamblers