【HAOI 2007】 上升序列

版权声明: https://blog.csdn.net/even_bao/article/details/80344485

【题目链接】

          点击打开链接

【算法】

          先预处理 : 将序列反转,求最长下降子序列

          对于每个询问,根据字典序性质,贪心即可

【代码】

         

#include<bits/stdc++.h>
using namespace std;
#define MAXN 10010

int i,j,len,n,q,mx,pre,l;
int a[MAXN],f[MAXN];
vector<int> res;

template <typename T> inline void read(T &x)  
{  
    int f = 1; x = 0;  
    char c = getchar();  
    for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }  
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';  
    x *= f;   
}  
template <typename T> inline void write(T x)  
{  
    if (x < 0)   
    {  
        putchar('-');  
        x = -x;   
    }     
    if (x > 9) write(x/10);  
    putchar(x%10+'0');  
}  
template <typename T> inline void writeln(T x)  
{  
    write(x);  
    puts("");  
}  

int main() {
		
		read(n); 
		for (i = 1; i <= n; i++) read(a[i]);
		reverse(a+1,a+n+1);
		for (i = 1; i <= n; i++)
		{
				f[i] = 1;
				for (j = i - 1; j >= 1; j--)
				{
						if (a[i] < a[j])
								f[i] = max(f[i],f[j]+1);
				}
				mx = max(mx,f[i]);
		}
		
		read(q);
		while (q--)
		{
				read(l);
				if (l > mx) 
				{
						puts("Impossible");
						continue;
				} else
				{
						res.clear();
						pre = 0;
						for (i = n; i >= 1; i--)
						{
								if (f[i] >= l && a[i] > pre)
								{
										res.push_back(a[i]);
										l--;
										pre = a[i];	
								}		
								if (!l) break;
						} 
						len = res.size();
						for (i = 0; i < len - 1; i++) 
						{
								write(res[i]);
								putchar(' ');
						}
						writeln(res[len-1]);
				} 
		}
		return 0;
	
}

上升序列和的最大值

06-11

EOJ上2958,由非负整数bi(0≤i 一个长度为n的序列a0, a1, ...,an-1,存在多种上升子序列:rn ai0, a i1, ..., a ik (0≤i0< i1<... 例如:序列1, 7, 3, 5, 9, 4, 8的上升子序列有1, 7、3, 5, 8、1, 3, 5, 9等。这些上升子序列中序列和最大为18,为上升子序列1, 3, 5, 9的和。rn 对于给定的序列,求出上升子序列和的最大值。rnrnInput rnrn第1行:整数T(1≤T≤10)为问题数rn 第2行:第1个问题的整数n(1≤n≤5000)rn 第3行:n个整数ai(0≤ai≤4000),由一个空格隔开。这些数的值有些可能是相等的。rn 后面是第2 ∽ T个问题的数据。格式与第1个问题相同。 rnrnOutput rnrn对于每个问题,输出一行问题的编号(0开始编号,格式:case #0: 等),然后在一行中输出上升子序列和的最大值。 rnrnSample Input rnrn2rn 7rn 1 7 3 5 9 4 8rn 4rn 100 20 20 3 rnrnSample Output rnrncase #0:rn 18rn case #1:rn 100 rnrnrnrn我不知道为什么wa了。。。。rnrnrn#includern#includernint compare(void const*a,void const*b)rnrn return *(int*)b-*(int*)a;rnrnvoid solve()rnrn int n,sum;rn long long int max=0;rn int i,j,k,t=0;rn int a[5005];rn long long int b[5005];rn scanf("%d",&n);rn for(i=0;imax)rn rn sum+=a[j];rn max=a[j];rn rn for(k=j+1;kmax)rn rn sum+=a[k];rn max=a[k];rn rn rn b[t]=sum;rn sum=a[i];rn max=a[i];rn t++;rn rn rn qsort(b,t,sizeof(long long int),compare);rn printf("%I64d\n",b[0]);rnrnint main()rnrn int i,t;rn scanf("%d",&t);rn for(i=0;i

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试