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

4月26日

时间:2016-04-26 19:06:09      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

poj3666

题意:将一串数改成非严格的上升或者非严格的下降,最少要改变多少

分析:一道非常经典的dp题,看了网上别人的思路才解决的。我们的目的是要将其改成非严格的单增或单减,并且求其最少的改变,所以对于那些不符合要求的点,我们使它变得跟前一个或者是后一个相同时,我们得到的改变才是最少的,这样,我们每次做改变之后的元素,必定会变味原来序列中的元素。所以我们得到如下的dp方程,令dp[i][j]为第i个位置改为B[j]或C[j]时,前i-1个有序的最小代价

dp[i+1][j]=min(dp[i][k])+abs(a[i]-b[j])(0<=k<=j),因为要保证为递增活着递减,所以k不能大于j

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=2020;
15 int a[maxn],b[maxn],c[maxn];
16 int dp1[maxn][maxn],dp2[maxn][maxn];
17 int n;
18 bool cmp(int x,int y)
19 {
20     return x>y;
21 }
22 int main()
23 {
24     while(cin>>n)
25     {
26         for(int i=0;i<n;i++)
27             cin>>a[i];
28         for(int i=0;i<n;i++){
29             b[i]=a[i]; c[i]=a[i];
30         }
31         sort(b,b+n); //求上升的情况
32         sort(c,c+n,cmp); //求下降的情况
33         memset(dp1,0,sizeof(dp1));
34         memset(dp2,0,sizeof(dp2));
35         for(int i=0;i<n;i++){
36             int minx=dp1[i][0];
37             for(int j=0;j<n;j++){
38                 minx=min(minx,dp1[i][j]);
39                 dp1[i+1][j]=minx+abs(a[i]-b[j]);
40             }
41         }
42         int min_up=1000000000;
43         for(int i=0;i<n;i++)
44             min_up=min(min_up,dp1[n][i]);
45         for(int i=0;i<n;i++){
46             int miny=dp2[i][0];
47             for(int j=0;j<n;j++){
48                 miny=min(miny,dp2[i][j]);
49                 dp2[i+1][j]=miny+abs(a[i]-c[j]);
50             }
51         }
52         int min_down=1000000000;
53         for(int i=0;i<n;i++)
54             min_down=min(min_down,dp2[n][i]);
55         cout<<min(min_up,min_down)<<endl;
56     }
57     return 0;
58 }
View Code

 

4月26日

标签:

原文地址:http://www.cnblogs.com/wolf940509/p/5436041.html

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