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】
见描述中的左图的分割方案,最小不满意度为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