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

[CF225C] Barcode (简单DAG上dp)

时间:2015-05-25 07:25:15      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://codeforces.com/problemset/problem/225/C

题目大意:给你一个矩阵,矩阵中只有#和.两种符号。现在我们希望能够得到一个新的矩阵,新的矩阵满足每一列都只有一种符号,并且连续相同符号的列数在区间[x,y]之间。

 

解:

现将列中的点统计出来,然后就是枚举把列数在x到y之间的需要更改为点的统计出来。这些点染上白色。

然后再将列数在x到y之间的需要更改为井号的点数统计出来,这些点染成黑色。

 

接下来就是DAG上的动态规划了,dp[i]代表从i到终点的最短路径。路径要求:相邻两个点的颜色不相同。

 

我是用的记忆化搜索,当然也很好改成递推。

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <vector>
 5 #include <map>
 6 #include <set>
 7 #include <bitset>
 8 #include <cmath>
 9 #include <numeric>
10 #include <iterator>
11 #include <iostream>
12 #include <cstdlib>
13 #include <functional>
14 #include <queue>
15 #include <stack>
16 #include <string>
17 using namespace std;
18 #define PB push_back
19 #define MP make_pair
20 #define SZ size()
21 #define ST begin()
22 #define ED end()
23 #define CLR clear()
24 #define ZERO(x) memset((x),0,sizeof(x))
25 typedef long long LL;
26 typedef unsigned long long ULL;
27 typedef pair<int,int> PII;
28 const double EPS = 1e-8;
29 const int INF = 999999999;
30 const int MAX_N = 1111;
31 struct NODE{
32     int l,r,val;
33 };
34 
35 vector<NODE> vec[MAX_N][2];
36 int n,m,x,y;
37 int a[MAX_N],sum[MAX_N],sumn[MAX_N];
38 int dp[MAX_N][2];
39 
40 int f(int st,int type){
41     int res = INF;
42     if( dp[st][type]!=INF ){
43         return dp[st][type];
44     }
45     for(int j=0;j<vec[st][type].size();j++){
46         if(vec[st][type][j].r==m)
47             res = min(res,vec[st][type][j].val);
48     }
49     for(int j=0;j<vec[st][type].size();j++) {
50         if(vec[st][type][j].r!=m)
51             res = min(res,vec[st][type][j].val+f(vec[st][type][j].r+1,1-type));
52     }
53     return dp[st][type] = res;
54 }
55 
56 int main(){
57     scanf("%d%d%d%d",&n,&m,&x,&y);
58     ZERO(a);
59     for(int i=1;i<=n;i++){
60         getchar();
61         for(int j=1;j<=m;j++){
62             char c = getchar();
63             if( c==. ){
64                 a[j]++;
65             }
66         }
67     }
68 
69     for(int i=1;i<=m;i++){
70         sum[i] = sum[i-1]+a[i];
71         sumn[i] = sumn[i-1]+n-a[i];
72         //dp[i] = INF;
73     }
74 
75     for(int i=1;i<=m;i++){
76         for(int j=x;j<=y;j++){
77             NODE N;
78             N.l = i;
79             N.r = i+j-1;
80             if( N.r>m ) break;
81             N.val = sum[N.r] - sum[N.l-1];
82             vec[N.l][0].PB(N);
83             N.val = sumn[N.r] - sumn[N.l-1];
84             vec[N.l][1].PB(N);
85         }
86     }
87     for(int i=0;i<MAX_N;i++){
88         dp[i][0] = dp[i][1] = INF;
89     }
90     int ans = f(1,0);
91     //for(int i=1;i<=m;i++) printf("%d ",dp[i]); puts("");
92     //for(int i=1;i<=m;i++) dp[i] = INF;
93     ans = min(ans,f(1,1));
94     //for(int i=1;i<=m;i++) printf("%d ",dp[i]); puts("");
95     printf("%d\n",ans);
96     return 0;
97 }

 

[CF225C] Barcode (简单DAG上dp)

标签:

原文地址:http://www.cnblogs.com/llkpersonal/p/4526917.html

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