https://vjudge.net/problem/UVA-10970
有大佬说是组合数学,没有看出哪里组合了。。
给定一个m*n的巧克力,让你分割成m*n份。最少多少刀
我发现,无论是怎么切,好像刀数都一样,。ac了。。
百度了一下,还有用记忆话的
大概就是能切两刀就切,直到切成长度或者宽度为1的。
如果长和宽奇数的话,就随便切一小块,先成偶数再说。、
记忆化
#include <iostream>
#include <cstring>
using namespace std;
int d[305][305];
int f(int i,int j)
{
if(d[i][j]!=-1) return d[i][j];
if(i==1) return d[i][j]=j-1;
if(j==1) return d[i][j]=i-1;
if(i%2==0) return d[i][j]=2*f(i/2,j)+1;
else if(j%2==0) return d[i][j]=2*f(i,j/2)+1;
else return d[i][j]=f(1,j)+f(i-1,j)+1;
}
int main()
{
int m,n;
while(cin>>m>>n)
{ memset(d,-1,sizeof(d));
cout<<f(m,n)<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{ int m,n;
while(~scanf("%d%d",&m,&n)){
printf("%d\n",(m-1)+m*(n-1));
}
本文探讨了一个经典的分割巧克力问题:如何将一块m*n的巧克力分割成m*n份,且使用的切割次数最少。通过分析发现,无论采用何种切割方式,切割次数似乎总是固定的。文中提供了一种记忆化的递归解法,并给出了一段简洁的实现代码。
1123

被折叠的 条评论
为什么被折叠?



