巧克力棒題解
阿新 • • 發佈:2018-12-27
巧克力棒題解出處(3755)
本大佬 蒟蒻來發一篇直接深搜+記憶化的題解
自認為速度比較快,總時間184ms
我就是用DFS來搜最小值,不信你自己看嘛。。。。。。
#include<cstdio>
#include<iostream>
using namespace std;
inline void read(int &x) {
x=0;int f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0' &&s<='9'){x=x*10+s-48;s=getchar();}
x*=f;
}
inline void pr(int x) {
if(x<0)x=-x;
if(x>9)pr(x/10);
putchar(x%10+48);
}//輸入輸出優化不解釋
int dp[35][35][55],n,k,m,t;
inline int dfs(int x,int y,int z) {
int i,j;
if(x>y)
swap(x,y);
int ans=1000000000;//不要開太慢,不然會爆,可以用0x3f3f3f3f
if(x*y==z||z==0)//如果全部正好可以和剩下的需求符合或者不需要了就返回
return 0;
if(dp[x][y][z])//有值可以直接返回,記憶化
return dp[x][y][z];
for(i=1; i<=x/2; i++)//橫著切,搜到一半就可以了,再往下是重複的
for(j=0; j<=z; j++)//深搜切每一種大小
ans=min(ans,dfs(i,y,j)/*長變了*/+dfs(x-i,y,z-j)/*寬變了*/+y*y/*花費*/);//更新
for(i=1; i<= y/2; i++)//同上
for(j=0; j<=z; j++)
ans=min(ans,dfs(x,i,j)+dfs(x,y-i,z-j)+x*x);
return dp[x][y][z]=ans;//記憶化
}
int main() {
read(t);//讀入
while(t--) {
read(n),read(m),read(k);
pr(dfs(n,m,k)),putchar('\n');
}
}
附測試點測試結果(LGOJ)
1
AC 15ms/264KB
2
AC 15ms/268KB
3
AC 15ms/268KB
4
AC 78ms/260KB
5
AC 61ms/256KB
大概就是這樣的,不知道大家能不能看懂,大家可以與我私信,一起討論討論