典型的dp
0<=i<=n-1
dp[i+1].usa=max{int(dp[j].can/r[i]*0.97)} 0<=j<=i;
dp[i+1].can=max{int(dp[j].usa*r[i]*0.97)} 0<=j<=i;
很简单的DP题
不过题目很邪恶,精度问题要注意-_____________-是说每次取到0.01..不能疏忽
- #include <iostream>
- #include <vector>
- using namespace std;
- struct _m
- {double usa,can;}M;
- vector<_m> dp;
- vector<double> r;
- int main()
- {
- int i,j,n;
- double tmp;
- M.usa=M.can=0;
- while(cin>>n,n)
- {
- dp.resize(n+1,M);
- r.clear();
- while(n--) cin>>tmp,r.push_back(tmp);
- dp[0].can=100000;dp[0].usa=int(100000/r[0]*0.97);
- for(i=0;i<r.size();i++)
- {
- dp[i+1]=dp[i];
- for(j=0;j<=i;j++)
- {
- if(int(dp[j].usa*r[i]*0.97)>dp[i+1].can)
- dp[i+1].can=int(dp[j].usa*r[i]*0.97);
- if(int(dp[j].can/r[i]*0.97)>dp[i+1].usa)
- dp[i+1].usa=int(dp[j].can/r[i]*0.97);
- }
- }
- printf("%.2lf/n",dp[r.size()].can/100);
- }
- return 0;
- }