VJP1218数字游戏(环形DP)

链接

数据比较小 直接爆了 5重 

枚举断开的琏 dp[i][j][k] (i-j)区间为第k段 dp[i][j][k] = min(dp[i][j][k],dp[g][i-1][k-1]*s[i][j])(g<=i-1) s[i][j]为i-j的和 

最大值类似 不知道为嘛要加50W  很纳闷 加小了就WA

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #define INF 100000
 7 using namespace std;
 8 int a[110],dp1[105][105][15],dp2[55][55][15],s[105][105];
 9 int main()
10 {
11     int i,j,k,n,g,o,e,aa,b,c;
12     while(scanf("%d%d",&n,&k)!=EOF)
13     {
14         for(i = 1; i <= n ; i++)
15         scanf("%d",&a[i]);
16         for(i = 1; i <= n ; i++)
17         a[n+i] = a[i];
18         for(i = 1; i <= 2*n ; i++)
19         {
20             s[i][i] = (a[i]+500000)%10;
21             for(j = i+1 ; j <= 2*n ; j++)
22             s[i][j] = (s[i][j-1]+a[j]+500000)%10;
23         }
24         int minz = INF,maxz=0;
25         for(i = 0; i < n ; i++)
26         {
27             for(aa = 0 ; aa <= k ; aa++)
28             for(c = 0 ; c <= 2*n ; c++)
29                 for(b = 0 ; b <= 2*n ; b++)
30                 {
31                     dp1[c][b][aa] = INF;
32                     dp2[c][b][aa] = 0;
33                 }
34             for(j = i+1 ; j <= i+n-(k-1) ; j++)
35             {
36                 dp1[i+1][j][1] = s[i+1][j];
37                 dp2[i+1][j][1] = s[i+1][j];
38             }
39             for(j = 2; j <= k ; j++)
40             {
41                 for(g = i+j ; g <= i+n-(k-j) ; g++)
42                 {
43                     for(e = g ; e <= i+n-(k-j) ; e++)
44                     {
45                         dp1[g][e][j] = INF;
46                         for(o = i+j-1 ; o < g ; o++)
47                         {
48                             dp1[g][e][j] = min(dp1[g][e][j],dp1[o][g-1][j-1]*s[g][e]);
49                             dp2[g][e][j] = max(dp2[g][e][j],dp2[o][g-1][j-1]*s[g][e]);
50                         }
51                     }
52                 }
53             }
54             for(j = i+1 ; j <= i+n ; j++)
55             {
56                 maxz = max(maxz,dp2[j][i+n][k]);
57                 minz = min(minz,dp1[j][i+n][k]);
58             }
59         }
60         printf("%d\n%d\n",minz,maxz);
61     }
62     return 0;
63 }
View Code

 

posted @ 2013-08-19 17:04  _雨  阅读(405)  评论(0编辑  收藏  举报