BZOJ 1084: [SCOI2005]最大子矩阵

一维的DP非常的弱

然后二维的时候跟一维差不多,多了个宽为2的矩形

f[i][j][k],i为左侧长度,j为右侧长度,然后枚举i,j就可以了

具体可以看看clj大神的题解,我就不多说什么了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int i,j,k,a,b,c,n,m,x,y;
 6 int s1[101]={};
 7 int s2[101]={};
 8 void work1()
 9 {
10      int f[101][11]={};
11      for(i=1;i<=n;i++)
12      {
13             scanf("%d",&a);
14             s1[i]=s1[i-1]+a;
15      }
16      for(i=1;i<=n;i++)
17      {
18             for(j=0;j<i;j++)
19             {
20                    for(c=1;c<=min(k,i);c++)
21                    {
22                         if(j>=c-1)
23                         {                   
24                           f[i][c]=max(f[i][c],f[j][c-1]+s1[i]-s1[j]);
25                           f[i][c]=max(f[i][c],f[j][c]);
26                         }
27                    }
28             }
29      }
30      printf("%d",f[n][k]);                                              
31 }
32 void work2()
33 {
34      int f[101][101][11]={};
35      for(i=1;i<=n;i++)
36      {
37             scanf("%d%d",&a,&b);
38             s1[i]=s1[i-1]+a;
39             s2[i]=s2[i-1]+b;
40      }
41      for(i=1;i<=n;i++)
42      {
43            for(j=1;j<=n;j++)
44            {
45                   if(i==j)
46                   {
47                          for(x=0;x<i;x++)
48                          {
49                                 for(c=1;c<=min(k,i);c++)
50                                 {
51                                     if(x>=c-1)
52                                     {                    
53                                         f[i][i][c]=max(f[i][i][c],f[x][x][c-1]+s1[i]-s1[x]+s2[i]-s2[x]);
54                                         f[i][i][c]=max(f[i][i][c],f[x][x][c]);
55                                     }
56                                 }
57                          }                         
58                   }
59                   for(x=0;x<i;x++)
60                   {
61                         for(c=1;c<=min(k,i);c++)
62                         {
63                                     if(x>=c-1)
64                                     {                    
65                                         f[i][j][c]=max(f[i][j][c],f[x][j][c-1]+s1[i]-s1[x]);
66                                         f[i][j][c]=max(f[i][j][c],f[x][j][c]);
67                                     }
68                         }
69                   }
70                   for(x=0;x<j;x++)
71                   {
72                         for(c=1;c<=min(k,j);c++)
73                         {
74                                     if(x>=c-1)
75                                     {                    
76                                         f[i][j][c]=max(f[i][j][c],f[i][x][c-1]+s2[j]-s2[x]);
77                                         f[i][j][c]=max(f[i][j][c],f[i][x][c]);
78                                     }
79                         }
80                   } 
81            }
82      }
83      printf("%d",f[n][n][k]);                                          
84 }
85 int main()
86 {
87     scanf("%d%d%d",&n,&m,&k);  
88     if(m==1)
89     {
90             work1();
91     }
92     else
93     {
94         work2();
95     }     
96     return 0;
97 }
View Code

 

posted @ 2014-03-16 17:09  wyc  阅读(250)  评论(0编辑  收藏