POJ1836AlignmentDP

    技术2026-04-05  2

    Problem Address:http://poj.org/problem?id=1836

     

    还是一道DP题,弄了半个晚上没弄好,没办法,去睡觉。

     

    早上想早点起,结果错过了闹钟。

     

    看了一下,居然就把错误找出来了。

     

    提交,AC。好自在~

     

    冲碗红烧牛肉泡面吃一下,难为了昨晚睡觉的时候肚子还咕咕叫,估计是费脑力了。

     

     

     

    思路是对每一个数向两边求递减和递增的最长序列。不过要注意存在中间相等的情况。

     

    以下贴代码:

     

    #include <iostream>using namespace std;double s[1005],dp[1005];struct end{ int ct; int m;};end ddp(int len){ int i,j,ct; ct = 0; for (i=0; i<len; i++) {  for (j=0; j<ct; j++)  {   if (dp[i]>=dp[j])   {    dp[j] = dp[i];    break;   }  }  if (j==ct)  {   dp[j] = dp[i];   ct++;  } } end e; e.ct = ct; e.m = dp[0]; return e;}int main(){ int n,total,i,j,k,max; end L,R; scanf("%d", &n); for (i=0; i<n; i++) {  scanf("%lf", &s[i]); } max = 0; for (k=0; k<n; k++) {  for (i=k-1,j=0; i>=0; i--)  {   if (s[i]<=s[k]) dp[j++]=s[i];  }  if (j!=0)   {   L = ddp(j);  }  else  {   L.ct = 0;   L.m = -1;  }  for (i=k+1,j=0; i<n; i++)  {   if (s[i]<=s[k]) dp[j++]=s[i];  }  if (j!=0)   {   R = ddp(j);  }  else  {   R.ct = 0;   R.m = -1;  }  if (L.m==s[k] && R.m==s[k]) total = L.ct+R.ct;  else total = L.ct+R.ct+1;  if (total>max) max = total;  } printf("%d/n", n-max); return 0;}

    最新回复(0)