3810: [Coci2015]Stanovi

50 篇文章 0 订阅

3810: [Coci2015]Stanovi

Time Limit: 15 Sec   Memory Limit: 64 MB
Submit: 650   Solved: 302
[ Submit][ Status][ Discuss]

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

[ Submit][ Status][ Discuss]

定义状态f[n][m][u][d][l][r]为边长是n*m的矩形,四边是否贴着边界,最优切割方案
显然,每次切至少有一刀切到底,所以暴力枚举,记忆化搜索一下就行了
不过这样会TLE,把对称的情形适当剪枝,缩小一下状态总数即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
#include<stack>
#define min(a,b) ((a) < (b) ? (a) : (b))
using namespace std;
 
const int N = 303;
typedef long long LL;
 
int n,m,k;
bool vis[N][N][2][2][2][2];
LL f[N][N][2][2][2][2];
 
inline LL Dfs(int N,int M,int l,int r,int u,int d)
{
    if (N > M) swap(N,M),swap(u,l),swap(d,r);
    if (u && !d) swap(u,d); if (l && !r) swap(l,r);
    if (vis[N][M][l][r][u][d]) return f[N][M][l][r][u][d];
    f[N][M][l][r][u][d] = 1LL * (N * M - k) * (N * M - k);
    if (u || d || (l && r))
        for (int i = 1; i < M; i++)
            f[N][M][l][r][u][d] = min(f[N][M][l][r][u][d],Dfs(N,i,l,0,u,d) + Dfs(N,M - i,0,r,u,d));
    if (l || r || (u && d))
        for (int i = 1; i < N; i++)
            f[N][M][l][r][u][d] = min(f[N][M][l][r][u][d],Dfs(i,M,l,r,u,0) + Dfs(N - i,M,l,r,0,d));
    vis[N][M][l][r][u][d] = 1; return f[N][M][l][r][u][d];
}
 
int main()
{
    #ifdef DMC
        freopen("DMC.txt","r",stdin);
    #endif
     
    cin >> n >> m >> k;
    cout << Dfs(n,m,1,1,1,1) << endl;
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值