题目链接:
首先,我们定义Month存储第i月与之前一共的天数、n存储商品个数、A存储初始时间、B存储投资天数、C存储年利息率、Time存储购买时间、dp存储答案:
#include<bits/stdc++.h>
using namespace std;
long long const MAX=1000001;
long long Month[14]={0,0,31,59,90,120,151,181,212,243,273,304,335,365}; //递增累加每月天数
long long n,A,B[MAX],Time[MAX]; //理财商品个数、发行时间、投资天数、购买时间
double dp[MAX],C[MAX]; //动态数组、年利息率
然后输入数据:
int main(){
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d %lf",&A,&B[i],&C[i]);
Time[i]=Month[A/100]+A%100;
}
将dp[1]初始化存储成本金10^5:
dp[1]=pow(10,5);
从dp[2]开始循环到365,每次dp[i]+=dp[i-1];,以保证上一次的最优结果不丢失,然后从1~n循环,看物品的购买时间与当天是否匹配,如果匹配,更新最优解,状态转移方程为:dp[i]=max(dp[Time[j]]*(1+(C[j]/100)/365*B[j]),dp[i]);
代码(核心):
dp[1]=pow(10,5);
for(int i=2;i<=365;i++){
dp[i]+=dp[i-1];
for(int j=1;j<=n;j++){
if(Time[j]+B[j]==i){
dp[i]=max(dp[Time[j]]*(1+(C[j]/100)/365*B[j]),dp[i]);
}
}
}
最后输出:
printf("%.2lf",dp[365]);
return 0;
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
long long const MAX=1000001;
long long Month[14]={0,0,31,59,90,120,151,181,212,243,273,304,335,365}; //递增累加每月天数
long long n,A,B[MAX],Time[MAX]; //理财商品个数、发行时间、投资天数、购买时间
double dp[MAX],C[MAX]; //动态数组、年利息率
int main(){
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d %lf",&A,&B[i],&C[i]);
Time[i]=Month[A/100]+A%100;
}
dp[1]=pow(10,5);
for(int i=2;i<=365;i++){
dp[i]+=dp[i-1];
for(int j=1;j<=n;j++){
if(Time[j]+B[j]==i){
dp[i]=max(dp[Time[j]]*(1+(C[j]/100)/365*B[j]),dp[i]);
}
}
}
printf("%.2lf",dp[365]);
return 0;
}
最后摆一下对题验证:
本蒟蒻第一次发题解,请多帮忙改正错误哈~