NC53265. 挂饰
描述
输入描述
第一行一个整数N,代表挂饰的个数。
接下来N行,第i行有两个空格分隔的整数和,表示挂饰i有个挂钩,安装后会获得的喜悦值。
输出描述
输出一行,一个整数,表示手机上连接的挂饰总和的最大值。
示例1
输入:
5 0 4 2 -2 1 -1 0 1 0 3
输出:
5
说明:
挂饰2直接挂在手机上,然后将挂饰1和挂饰5分别挂在挂饰2的两个挂钩上,可以获得最大喜悦值4-2+3=5。示例2
输入:
6 2 -3 3 -1 0 -4 0 -2 1 -3 4 -1
输出:
0
说明:
允许一个挂饰都不挂。示例3
输入:
15 1 -4034 1 3406 0 6062 4 -6824 0 9798 0 4500 0 -1915 1 2137 0 9786 0 7330 0 -9365 2 2730 0 -5797 0 6129 0 8925
输出:
43417
C++11(clang++ 3.9) 解法, 执行用时: 19ms, 内存消耗: 16220K, 提交时间: 2020-08-31 10:49:55
#include<bits/stdc++.h> #define turn_on_clock clock_t start,end;start=clock(); #define Fox ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define turn_off_clock end=clock();printf("\nTime eclipse:%.5lfms\n",(double)(end-start)/CLOCKS_PER_SEC*1000); using namespace std; const int N=1e3+10; const int INF=0x3f3f3f3f; const int mod=998244353; const double PI=atan(1.0)*4.0; struct Node{ int a,b; bool friend operator<(Node x,Node y){ if(x.a!=y.a)return x.a>y.a; return x.b>y.b; } }p[2005]; int n,dp[2005][2005]; int main(){ Fox; cin>>n; for(int i=1;i<=n;i++)cin>>p[i].a>>p[i].b; sort(p+1,p+1+n); for(int i=0;i<=2001;i++) for(int j=0;j<=2001;j++)dp[i][j]=-2e9-1000; dp[0][1]=0; for(int i=1;i<=n;i++){ for(int j=0;j<=n;j++)dp[i][j]=max(dp[i][j],dp[i-1][max(0,j-p[i].a)+1]+p[i].b); for(int j=0;j<=n;j++)dp[i][j]=max(dp[i][j],dp[i-1][j]); } /* for(int i=1;i<=n;i++,cout<<"\n") for(int j=0;j<=n;j++) cout<<dp[i][j]<<" "; */ int ans=0; for(int i=0;i<=n;i++)ans=max(ans,dp[n][i]); cout<<ans; return 0; } /* 3 2 -2 0 4 0 3 */