BZOJ3810: [Coci2015]Stanovi

3810: [Coci2015]Stanovi

Description

 

Input

输入一行,三个整数,n, m, k
 

 

Output

输出一个数,表示最小不满意度。
 

Sample Input

3 3 2

Sample Output

1

【Hint】
见描述中的左图的分割方案,最小不满意度为4 * (2 - 2) ^ 2 + (1 - 2) ^ 2 = 1。

【数据范围】
n, m <= 300
k <= 10000

HINT

 

Source


dp
f[x][y][u][d][l][r]表示x*y的矩阵且边的临接情况
u=1表示上面连接了,0表示没有连接
d是下面,l r是左右
初值是(xy-K)^2
在合法范围内转移即可
 1 /**************************************************************
 2     Problem: 3810
 3     User: white_hat_hacker
 4     Language: C++
 5     Result: Accepted
 6     Time:6192 ms
 7     Memory:12448 kb
 8 ****************************************************************/
 9  
10 #include<cstdio>
11 #include<cstdlib>
12 #include<algorithm>
13 #include<cstring>
14 #define MAXN 305
15 #define ll long long
16 using namespace std;
17 int n,m,k;
18 ll f[MAXN][MAXN][2][2][2][2];
19 ll dp(int x,int y,int u,int d,int l,int r){
20     if(x<y){
21         swap(x,y);
22         swap(u,r);
23         swap(d,l);
24     }
25     if(!u&&d){
26         swap(u,d);
27     }
28     if(!l&&r){
29         swap(l,r);
30     }
31     ll &p=f[x][y][u][d][l][r];
32     if(p!=-1){
33         return p;
34     }
35     p=(ll)(x*y-k)*(x*y-k);
36     for(int i=1;i<x;i++){
37         if(!l&&!r&&(!u||!d)) continue;
38         p=min(p,dp(i,y,u,0,l,r)+dp(x-i,y,0,d,l,r));
39     }
40     for(int j=1;j<y;j++){
41         if(!u&&!d&&(!r||!l)) continue;
42         p=min(p,dp(x,j,u,d,l,0)+dp(x,y-j,u,d,0,r));
43     }
44     return p;
45 }
46 int main()
47 {
48     memset(f,-1,sizeof(f));
49     scanf("%d%d%d",&n,&m,&k);
50     printf("%lld",dp(n,m,1,1,1,1));
51     return 0;
52 }
53 

 

posted @ 2017-10-25 00:48  white_hat_hacker  阅读(218)  评论(0编辑  收藏  举报