1. 程式人生 > >巧克力棒題解

巧克力棒題解

巧克力棒題解出處(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
大概就是這樣的,不知道大家能不能看懂,大家可以與我私信,一起討論討論