期望得分:100+30+60=190
实际得分:100+30+30=160
T1
最优方案跳的高度一定是单调的
所以先按高度排序
dp[i][j] 跳了i次跳到j
枚举从哪儿跳到j转移即可
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 51 struct node { int c,h; }e[N]; int dp[N][N]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } bool cmp(node p,node q) { return p.h<q.h; } int main() { freopen("meet.in","r",stdin); freopen("meet.out","w",stdout); int n; read(n); for(int i=1;i<=n;i++) read(e[i].c); for(int i=1;i<=n;i++) read(e[i].h); sort(e+1,e+n+1,cmp); memset(dp,63,sizeof(dp)); for(int i=1;i<=n;i++) dp[0][i]=e[i].c; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { for(int k=1;k<j;k++) dp[i][j]=min(dp[i][j],dp[i-1][k]+e[j].h-e[k].h); dp[i][j]+=e[j].c; } int t; read(t); for(int i=n;i>=0;i--) for(int j=1;j<=n;j++) if(dp[i][j]<=t) { printf("%d",i+1); return 0; } }