题目链接:HDU - 6789
直接枚举死亡的两个人即可。
然后dp[i][j]为第一个人剩的血量为 i 第二个为 j 的最小次数。
然后枚举转移即可。
代码比赛的时候过了,然后HDU上面卡常。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
int dp[1010][1010],n=1000;
int calc(int x,int y,int z){
for(int i=1;i<=n;i++) dp[0][i]=dp[i][0]=(i+z-1)/z;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
dp[i][j]=dp[max(0,i-y)][max(0,j-x)]+1;
dp[i][j]=min(dp[i][j],min(dp[max(0,i-z)][j]+1,dp[i][max(0,j-z)]+1));
}
return dp[n][n];
}
void solve(){
int x,y,z; cin>>x>>y>>z;
cout<<min(calc(x,y,z),min(calc(y,z,x),calc(x,z,y)))<<endl;
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}