1 #include2 using namespace std; 3 const int INF =10000000; 4 int n,a,b; 5 int h[12]; 6 int res; 7 int res_dp=INF; 8 void dp(int N,int ans) 9 {10 if (N==n-1)11 {12 res_dp=res_dp > ans ? ans : res_dp;13 return ; 14 } 15 if (h[N-1]<0)16 {dp(N+1,ans);}17 int time=0;18 if (h[N-1]>=0)19 {20 time=h[N-1]/b+1;21 h[N-1] -=time*b;22 h[N] -=time*a;23 h[N+1] -=time*b;24 dp(N+1,ans+time);25 h[N-1]+=time*b;26 h[N] +=time*a;27 h[N+1] +=time*b; 28 }29 int time_=h[N]/a+1;30 31 if (h[N]>=0&&time_>time)32 {33 for (int i=time+1;i<=time_;i++)34 {35 h[N-1]-=b*i;36 h[N] -=a*i;37 h[N+1]-=b*i;38 dp(N+1,ans+i);39 h[N-1] +=b*i;40 h[N] +=a*i;41 h[N+1] +=b*i;42 } 43 }44 return ;45 }46 int main()47 {48 cin>>n>>a>>b;49 for (int i=0;i >h[i];52 }53 int time1 = h[0]/b+1;54 h[0]-=b*time1;55 h[1]-=a*time1;56 h[2]-=b*time1;57 res+=time1;58 if (h[n-1]>=0){59 int time2 = h[n-1]/b+1;60 h[n-1]-=b*time2;61 h[n-2]-=b*time2;62 h[n-3]-=b*time2;63 res+=time2 ;64 }65 dp(1,0);66 if (res_dp==INF)res_dp=0;67 //cout< <
弱鸡的思路:优先打爆最两边,做到消耗最小。然后分两种类型打爆一个点:1、通过本点打爆上一个点,然后继续。2、通过本点打爆上一点且对本点打击到爆。
就是将所有的可能发生的情况都走一遍。(代码是借鉴的)。记得看了下知乎,DFS,BFS是最好掌握,最简单的方法。然后又看了下自己做题,脑子一团浆糊。心好凉啊感觉真的是菜到爆炸。