【未知】P2331 [SCOI2005]最大子矩阵

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int n, m, k;
 6 int s1[101], s2[101], f[101][101][11];
 7 
 8 int main()
 9 {
10     cin >> n >> m >> k;
11     if (m == 1)
12     {
13         for (int i = 1; i <= n; i++)
14         {
15             int t;
16             cin >> t;
17             s1[i] = s1[i - 1] + t;
18         }
19         for (int h = 1; h <= k; h++)
20         {
21             for (int i = 1; i <= n; i++)
22             {
23                 f[0][i][h] = f[0][i - 1][h];
24                 for (int j = 0; j < i; j++)
25                     f[0][i][h] = max(f[0][i][h], f[0][j][h - 1] + s1[i] - s1[j]);
26             }
27         }
28         cout << f[0][n][k];
29         return 0;
30     }
31     for (int i = 1; i <= n; i++)
32     {
33         int t;
34         cin >> t;
35         s1[i] = s1[i - 1] + t;
36         cin >> t;
37         s2[i] = s2[i - 1] + t;
38     }
39     for (int h = 1; h <= k; h++)
40     {
41         for (int i = 1; i <= n; i++)
42         {
43             for (int j = 1; j <= n; j++)
44             {
45                 f[i][j][h] = max(f[i - 1][j][h], f[i][j - 1][h]);
46                 for (int x = 0; x < i; x++) f[i][j][h] = max(f[i][j][h], f[x][j][h - 1] + s1[i] - s1[x]);
47                 for (int x = 0; x < j; x++) f[i][j][h] = max(f[i][j][h], f[i][x][h - 1] + s2[j] - s2[x]);
48                 if (i == j)  for (int x = 0; x < i; x++) f[i][j][h] = max(f[i][j][h], f[x][x][h - 1] + s1[i] - s1[x] + s2[j] - s2[x]);
49             }
50         }
51     }
52     cout << f[n][n][k];
53     return 0;
54 }
View Code

 

posted on 2019-10-09 13:23  thjkhdf12  阅读(114)  评论(0)    收藏  举报