SOJ2500 DP

Problem Address:http://soj.me/2500

 

这道题和POJ1836是基本相同的。

 

之前还写过一篇解题报告= = http://blog.csdn.net/Human_CK/archive/2011/02/18/6192560.aspx

 

但是时隔今日……

 

然后看了别人的解题报告,WA了几次后终于知道当初的为什么了……

 

以下贴代码:

 

#include <iostream> #include <stdio.h> using namespace std; int n; int num[1005], l[1005], r[1005]; int main() { int i, j, max; while(scanf("%d", &n)!=EOF) { for (i=0; i<n; i++) scanf("%d", &num[i]); for (i=0; i<n; i++) { l[i] = 1; for (j=0; j<i; j++) { if (num[i]>num[j] && l[i]<=l[j]) { l[i] = l[j] + 1; } } } for (i=n-1; i>=0; i--) { r[i] = 1; for (j=n-1; j>i; j--) { if (num[i]>num[j] && r[i]<=r[j]) { r[i] = r[j] + 1; } } } max = 0; for (i=0; i<n; i++) { for (j=i+1; j<n; j++) { if (num[i]==num[j]) { if (r[i]<=r[j]) { r[i] = r[j]+1; } } } if (l[i]+r[i]-1>max) max = l[i]+r[i]-1; } printf("%d/n", n-max); } return 0; }

 

有一种情况,比如 1 2 3 4 3 4 3 2 1。

 

 L[4] = 4

 R[5] = 3

 R[6] = 4

 

而其实是可以同时存在两个4的。此时应该寻找该位右边是否存在与它等高的数。

你可能感兴趣的:(SOJ2500 DP)