Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2061 Accepted Submission(s): 1023
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<cstdlib> #include<queue> #include<set> #include<vector> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-10 #define PI acos(-1.0) #define ll long long int const maxn = 1e5+7; const int mod = 1e9 + 7; int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } int val[2020]; int dp[2020]; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n-1;i++) scanf("%d",&val[i]); int v=2*(n-1)-n; //一开始将所有的点都看作一度顶点,那么剩余的定点就是2*(n-1)-n,接下来将v个度数进行dp for(int i=1;i<=n-1;i++) dp[i]=-INF; dp[0]=val[1]*n; //一开始将dp[0]初始化为所有的点都是一度顶点的总value值 for(int i=2;i<=n-1;i++) //从二度顶点到n-1度顶点开始循环dp for(int j=i-1;j<=v;j++) //最多只有v个顶点可以进行调控 dp[j]=max(dp[j],dp[j-i+1]+val[i]-val[1]); //增添一个度数为i的顶点,一开始由于所有的顶点都是一度顶点,所以使用的cost是i-1,而得到的value值是val[i]-val[1] printf("%d\n",dp[v]); } }
原文:https://www.cnblogs.com/smallhester/p/9550904.html