题目描述:
输入描述:
输出描述:
思路:
采用动态规划(dp)
分为3类:td qcjjkkt qcjjkktd 大小为2,7,8最小公倍数为56
当n极大 把大部分按照最有重复剩下用dp,当n极大分为3种全td 全qcjjkkt 全qcjjkktd取最大值
剩下部分 i-2基础上加上td i-7基础加上qcjjkkt i-8基础加上qcjjkktd
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
long long n,a,b;
cin>>n>>a>>b;
long long sum=0;
if(n>56){//重复块最优化
long long m=max({b*28,a*8,(a+b)*7});
long long cnt=n/56;
sum+=(cnt-1)*m;
n-=56*(cnt-1);
}
vector<long long>ans(n+1);
for(int i=1;i<=n;i++){
if(i>=2) ans[i]=max(ans[i],ans[i-2]+b);//加上td
if(i>=7) ans[i]=max(ans[i],ans[i-7]+a);//加上qcjjkkt
if(i>=8) ans[i]=max(ans[i],ans[i-8]+a+b);//加上qcjjkktd
}
sum+=ans[n];
cout<<sum<<"\n";
}
}

京公网安备 11010502036488号