2017暑假 动态规划

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017暑假 动态规划相关的知识,希望对你有一定的参考价值。

  • 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暑假 动态规划的主要内容,如果未能解决你的问题,请参考以下文章

2018年暑假ACM个人训练题9(动态规划)解题报告

2017暑假集训前总结和规划

2022.07.13 暑假集训 个人排位赛

2022.07.13 暑假集训 个人排位赛

2022.07.13 暑假集训 个人排位赛

详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++