标签:multiple ota sbo margin process while one core sample
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
题目大意:N个数字组成的一条路,每个数字是一个节点顺序连接,起点在第一个数之前,终点在第N个数之后。现让你选择一条路从起点跳到终点,只能往前且跳到比当前点大的那个点,可以认为终点是最大的,可以从起点直接跳到终点但是路的值就是0了,每条路的值为所经过的数字节点的值的和,问你值最大为多少。
解题思路:决策:在当前点i往i~N哪个点跳,反过来当前点i+1可以从1~i哪个点跳过来,那么a[i+1] > a[i],很明显:
dp[i]:=走到第i个点的最大值
dp[i] = max(dp[j] + a[i]) 1 < j < i, a[i] > a[j]
代码:
1 const int maxn = 1e3 + 5; 2 int n; 3 ll a[maxn]; 4 ll dp[maxn]; 5 6 void solve(){ 7 memset(dp, 0, sizeof(dp)); 8 for(int i = 1; i <= n; i++) dp[i] = a[i]; 9 ll ans = 0; 10 for(int i = 2; i <= n; i++){ 11 for(int j = 1; j < i; j++){ 12 if(a[j] < a[i] && dp[j] + a[i] > dp[i]){ 13 dp[i] = dp[j] + a[i]; 14 } 15 } 16 ans = max(ans, dp[i]); 17 } 18 printf("%I64d\n", ans); 19 return; 20 } 21 int main(){ 22 while(scanf("%d", &n) && n){ 23 for(int i = 1; i <= n; i++) scanf("%I6d", &a[i]); 24 solve(); 25 } 26 }
题目:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 40679 Accepted Submission(s): 18824
HDU 1087 Super Jumping! Jumping! Jumping! 简单DP
标签:multiple ota sbo margin process while one core sample
原文地址:http://www.cnblogs.com/bolderic/p/7360486.html