最长上升序列

每一个数之前的上升序列个数
dp[i]:以ai为末尾的最长上升子序列的长度
以ai结尾的上升子序列是:
只包含ai的子序列
在满足j

#include 
using namespace std;
int dp[1001];
int n,a[1001];
int main(){
    cin>>n;
    for(int i=0;i>a[i];
    int res=0;
    for(int i=0;i

用DP针对相同长度情况下最小末尾元素进行求解
最开始全部dp的值初始化为INF。然后由前到后逐个考虑数列的元素,对于每个aj,如果i=0或者dp[i-1]

#include 
using namespace std;
int dp[1001];
int n,a[1001];
int INF=1000000;
int main(){
    cin>>n;
    for(int i=0;i>a[i];
    fill(dp,dp+n,INF);
    for(int i=0;i
过程

知识点补充

  • lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。
  • 在从小到大的排序数组中,
  • lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
  • upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
  • 在从大到小的排序数组中,重载lower_bound()和upper_bound()
  • lower_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
  • upper_bound( begin,end,num,greater() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

 

FatMouse's Speed

//#include 
using namespace std;
int dp[1001],rem[1001];
int a[1001];
int INF=1000000;
typedef struct Mouse{
    int weight;//重量
    int speed;//速度
    int num;//编号 
}mice;
mice s[10001];
bool cmp(mice x,mice y){
    if(x.weight==y.weight)
        return x.speedy.weight;
}

int main(){
    int n,m,maxn,i,j,k,t,mark;
    for(i=1;i<10001;i++)
        rem[i]=i;//每只记录的老鼠都是自己
    k=1;
    while(scanf("%d%d",&s[k].weight,&s[k].speed)!=EOF){
        s[k].num=k;
        k++;
    } 
    sort(s+1,s+k,cmp);//排序啦
    for(i=1,m=0;i

你可能感兴趣的:(最长上升序列)