思路:

我们很简单可以得到有三种方案:

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();
	} 
}