“玲珑杯”ACM比赛 Round #18 图论你先敲完模板(dp)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“玲珑杯”ACM比赛 Round #18 图论你先敲完模板(dp)相关的知识,希望对你有一定的参考价值。

题目链接:http://www.ifrog.cc/acm/problem/1146

题意:中文题

题解:状态转移方程:dp[ i ] = min ( dp[ i ] ,dp[ j ] + 2xi-xj+a ).

dp[1]=0,第一个点需要消耗的能量为0,从第二个点(假设这个点为A)开始,往前遍历一遍点(假设这个点为B)假定B点为休息点,然后直接到A点需要的能量,

依次然后找出最小能量,因为从第二个点依次往后,每次前面的都已经最优了,所以最后n位置得到的就是答案了。

然后有几个注意点INF尽量弄大点,因为数据挺大的,毕竟是以2的指数幂来算的,题目里面还有一个很重要的条件:0≤xi+1−xi≤30。

 1 #include <cstdio>
 2 using namespace std;
 3 
 4 const int N=1e5+10;
 5 typedef long long LL;
 6 LL POW(LL x,LL n){
 7     LL ans=1;
 8     while(n>0){
 9         if(n&1) ans=ans*x;
10         x=x*x;
11         n>>=1;
12     }
13     return ans;
14 }
15 LL min(LL a,LL b){
16     return (a>b) ? b : a;
17 }
18 const LL INF=1e18;
19 LL x[N],dp[N];
20 
21 int main(){
22     int t;
23     scanf("%d",&t);
24     while(t--){
25         int n,a;
26         scanf("%d %d",&n,&a);
27         for(int i=1;i<=n;i++){
28             scanf("%lld",&x[i]);
29             dp[i]=INF;
30         }
31         dp[1]=0;
32         for(int i=2;i<=n;i++){
33             for(int j=i-1;j>=1;j--){
34                 if(x[i]-x[j]>30) break;
35                 dp[i]=min(dp[i],dp[j]+POW(2,x[i]-x[j])+a);
36             }
37         }
38         printf("%lld\n",dp[n]);
39     }
40     
41     return 0;
42 }

 

以上是关于“玲珑杯”ACM比赛 Round #18 图论你先敲完模板(dp)的主要内容,如果未能解决你的问题,请参考以下文章

“玲珑杯”ACM比赛 Round #18 A 暴力水 C dp

“玲珑杯”ACM比赛 Round #23

“玲珑杯”ACM比赛 Round #18 A 计算几何你瞎暴力(瞎暴力)

“玲珑杯”ACM比赛 Round #19

“玲珑杯”ACM比赛 Round #1

“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)