poj1836--Alignment题解
来源:互联网 发布:mysql distinct 用法 编辑:程序博客网 时间:2024/06/11 18:01
来源:http://poj.org/problem?id=1836
思路:本题可以转换为求一个最长的先递增后递减数列,或者递增数列,或者递减数列。可以先正向求一个递增序列,再逆向求一个递增序列,通过这两个序列求出第i个数的左右两边的最长递增数列长度的和,求n个数的长度和的最大值。
代码:
#include <stdio.h>int n,f1[1001],f2[1001],max;//f1,f2分别记录正向和逆向的最长递增数列的长度float a[1001];int main(){ scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%f",&a[i]); } f1[0]=1; for(int i=1;i<n;i++) { max=1; for(int j=0;j<i;j++) if(a[j]<a[i]&&f1[j]+1>max) max=f1[j]+1; f1[i]=max; }//求正向递增数列的长度 f2[n-1]=1; for(int i=n-2;i>=0;i--) { max=1; for(int j=i+1;j<n;j++) if(a[j]<a[i]&&f2[j]+1>max) max=f2[j]+1; f2[i]=max; }//求逆向递增数列的长度 max=1; for(int i=0;i<n;i++) { if(f1[i]>max) max=f1[i]; f1[i]=max; }//求第i个数左边的最长递增数列的长度 max=1; for(int i=n-1;i>=0;i--) { if(f2[i]>max) max=f2[i]; f2[i]=max; }//求第i个数右边的最长递增数列的长度 max=0; for(int i=0;i<n-1;i++) if(f1[i]+f2[i+1]>max) max=f1[i]+f2[i+1]; printf("%d",n-max); return 0;}
0 0
- poj1836--Alignment题解
- POJ1836--Alignment
- poj1836 Alignment
- poj1836 Alignment
- poj1836 Alignment
- poj1836 Alignment
- poj1836 Alignment
- Alignment poj1836
- 【POJ1836】【Alignment】
- poj1836 Alignment
- POJ1836-Alignment
- [POJ1836]Alignment
- POJ1836 Alignment DP
- POJ1836——Alignment
- poj1836(dp) Alignment
- POJ1836——Alignment
- poj1836 Alignment(LIS)
- poj1836 Alignment LIS傻逼题
- [LeetCode]Count and Say
- [CodeEdit--Sublime]一些好用的Plugins
- 分别使用Eclipse EE和IntelliJ IDEA构建基于Maven的Java Web项目
- 论编程学习方法的重要性
- 2015年7月22日笔记
- poj1836--Alignment题解
- Codeforces Amr and Chemistry(数学+乱搞)
- linux解压zip中文乱码问题
- javaScript中自定义对象(类的定义方式)
- Java设计模式之基本原则(一)
- 杭电oj red and black(简单的深搜)
- 【IAP支付之一】In-App Purchase Walk Through 整个支付流程
- C# Winform界面中的分隔线问题
- try catch注意事项