题意:道路上有n个显示器,让你选择三个显示器,每个显示器都有显示字体的大小,和费用,你需要租三个显示器,每个显示器显示字体的大小,逐渐递增,然后让他们花费最小。输入n,然后下面一行每个显示器的能够显示字体的大小,然后n个显示器的花费。
题解:暴力 或者dp 暴力就先选择一个显示器,找前面尺寸比它小的,后面尺寸比他大的一个显示器。然后记录费用,取最小值。dp的话,dp学的不好,看别人博客:因为只用选出三个物品,dp[i,j]代表第ii个物品作为选出的三个物品中的第
k个物品的最小花费,显然有:dp[i,j]=min(dp[i,j−1]+c[i],dp[i][j])。
#include<bits/stdc++.h> using namespace std; int main() { long long n,s[3010],c[3010],ans=1e10; cin>>n; for(int i=0; i<n; i++) cin>>s[i]; for(int i=0; i<n; i++) cin>>c[i]; for(int i=0; i<n; i++) { long long min1=1e10,min2=1e10; for(int j=0; j<i; j++) { if(s[j]<s[i]) min1=min(min1,c[j]); } for(int j=i; j<n; j++) { if(s[j]>s[i]) min2=min(min2,c[j]); } ans=min(ans,min1+c[i]+min2); } if(ans>=1e10) puts("-1"); else cout<<ans; return 0; }
DP:
#include<bits/stdc++.h> using namespace std; int main() { long long n,s[3010],c[3010],dp[3010][10],ans=1e10; cin>>n; for(int i=0; i<n; i++) cin>>s[i]; for(int i=0; i<n; i++) cin>>c[i]; memset(dp,0x3f3f3f,sizeof(dp)); for(int i=0; i<n; i++) { dp[i][1]=c[i]; for(int j=2; j<=3; j++) for(int k=0; k<i; k++) if(s[i]>s[k]) dp[i][j]=min(dp[i][j],dp[k][j-1]+c[i]); } for(int i=0; i<n; i++) ans=min(dp[i][3],ans); if(ans>=1e10) puts("-1"); else cout<<ans; return 0; }