码迷,mamicode.com
首页 > 其他好文 > 详细

2017暑假 动态规划

时间:2017-07-23 00:51:32      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:二次   pac   name   条件   pen   src   strong   log   inf   

  • uva 10534 - Wavio Sequence

题意:“长度”对称的LIS。

思路:正、逆序求两次LIS,正序就ansi[i] 存放a[0]~a[i]LIS,逆序也差不多这样。。。然后拿着两个ans数组对比着找到满足条件的最大解。

代码如下:

技术分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int inf = 0x3f3f3f3f;
 5 
 6 int main()
 7 {
 8     int n, in[10005], de[10005];
 9     while(~scanf("%d", &n))
10     {
11         for(int i = 0; i < n; i++)
12         {
13             scanf("%d", &in[i]);
14             de[n-i-1] = in[i];
15         }
16 
17         int len = 1, ansi[10005], ansd[10005], dp[10005];
18         memset(dp, inf, sizeof(dp));
19         dp[len] = in[0];
20         for(int i = 0; i < n; i++)
21         {
22             if(in[i] > dp[len]) dp[++len] = in[i];
23             else
24                 *lower_bound(dp+1, dp+n+1, in[i]) = in[i];
25             ansi[i] = len;
26         }
27         len = 1, dp[len] = de[0];
28         memset(dp, inf, sizeof(dp));
29         for(int i = 0; i < n; i++)
30         {
31             if(de[i] > dp[len]) dp[++len] = de[i];
32             else
33                 *lower_bound(dp+1, dp+n+1, de[i]) = de[i];
34             ansd[n-i-1] = len;//n-i-1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
35         }
36 
37         int ans = 0;
38         for(int i = 0; i < n; i++)
39         {
40             int temp = min(ansi[i], ansd[i]);
41             ans = max(ans, temp*2-1);
42         }
43         printf("%d\n", ans);
44     }
45     return 0;
46 }
View Code

ps: 第二次写!!!ansd[n-i-1] = len;这里n-i-1写成了i。。。wa了一下午QAQ。

2017暑假 动态规划

标签:二次   pac   name   条件   pen   src   strong   log   inf   

原文地址:http://www.cnblogs.com/curieorz/p/7223202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!