思路:
我们很简单可以得到有三种方案:
1.val 为2
2.val 为7
3.val 为8
这三种方案最小公倍数为56,也就是说每56个val一定能得到最大值,因此我们可以直接用最基本的dp解决而不用考虑其他做法,注意,如果%56有余数,一定要分一个56给这个余数方能得到最优解,所以dp的范围为1-112;
代码:
#include<bits/stdc++.h>
#define PII pair<int,int>
#define int long long
using namespace std;
const int mod=1e9+7;
void slove() {
int n,a,b; cin>>n>>a>>b;
vector<int> dp(120,0);
for(int i=1;i<112;i++) {
dp[i]=dp[i-1];
if(i>=2) dp[i]=max(dp[i],dp[i-2]+b);
if(i>=7) dp[i]=max(dp[i],dp[i-7]+a);
if(i>=8) dp[i]=max(dp[i],dp[i-8]+a+b);
}
if(n<112) cout<<dp[n]<<endl;
else {
int d=n%56;
int f=n/56;
if(d!=0) {
f--;
d=d+56;
cout<<f*dp[56]+dp[d]<<endl;
}
else {
cout<<f*dp[56]<<endl;
}
}
}
signed main() {
int t; cin>>t;
while(t--) {
slove();
}
}

京公网安备 11010502036488号