POJ1836
来源:互联网 发布:天刀全服最美捏脸数据 编辑:程序博客网 时间:2024/05/16 08:29
Problem: Alignment
Description: 一行士兵排队,他们的身高高矮不一,现在教官想让他们排成这样一个队,从这些士兵中挑选一些士兵出队,使得每个士兵都能看到队头或者队尾。现在问你最少要抽多少士兵出来。
Solution: 首先,我们可以想到如果士兵要看到队头或者队尾,那么这些士兵就必须得在一个三角形的两边之一,一个上升边或者一个下降边。那么我们就先用最长上升子序列算法先求出从队头上升的
Code(C++):
#include <stdio.h>#include <string.h>const int M=1000+5;double a[M];int dp_1[M];int dp_2[M];int n;void get_the_max_line(int dp[]){ int i,j; dp[1]=1; for(i=2;i<=n;i++){ int pos=0; int tmpmax=0; for(j=i-1;j>=1;j--) if(a[i]>a[j]&&dp[j]>tmpmax) tmpmax=dp[j],pos=j; dp[i]=(pos? dp[pos]+1:1); }}int main(){ while(~scanf("%d",&n)){ int i,j; for(i=1;i<=n;i++) scanf("%lf",&a[i]); memset(dp_1,0,sizeof(dp_1)); memset(dp_2,0,sizeof(dp_2)); get_the_max_line(dp_1); for(i=1;i<=n/2;i++){ double tmp=a[i]; a[i]=a[n-i+1]; a[n-i+1]=tmp; } get_the_max_line(dp_2); int themin=M; for(i=1;i<=n-1;i++) for(j=i+1;j<=n;j++){ int l=dp_1[i]; int r=dp_2[n-j+1]; int tmp=n-l-r; themin=(themin<tmp? themin:tmp); } printf("%d\n",themin); } return 0;}
0 0
- poj1836
- poj1836
- poj1836
- POJ1836
- poj1836
- poj1836
- POJ1836
- [DP] poj1836
- poj1836--lis
- POJ1836--Alignment
- poj1836 Alignment
- poj1836 Alignment
- poj1836 Alignment
- POJ1836(LIS)
- poj1836 Alignment
- poj1836 Alignment
- [DP]poj1836
- Alignment poj1836
- 第13周-动物这样叫2-3
- 抽象类和接口
- Linux-ln命令
- Android基础之json字段重命名
- ajax跨域请求下parsererror错误
- POJ1836
- 第15周项目1:程序填空
- 自定义view实现流程进度的绘制(提现流程进度,转账流程进度等等啦)
- 将android源码导入as
- Linux之进程调度
- 求奇数的乘积
- PreferenceFragment的使用
- Android 角标 BadgeView/android-viewbadger使用介绍
- C#连接Excel和Access(包括2003和2007版)方法总结