Power oj 1782

来源:互联网 发布:aes算法加密过程 编辑:程序博客网 时间:2024/06/11 07:51

Description

There is n pillars, their heights are (A1,A2,A3,…An. You can jump at the top of the pillars. But you will lose abs(a[j]-a[i])*abs(j-i) power when you jump from i-th pillar to j-th pillar. At first you have m power. Can you jump from s-th pillar to e-th pillar?

Input

The input consists of several test cases.Every test case is two integer n(2<=n<200), q(1=<q<=10000).The second line contain n integer A1, A2, A3,..An.The next q line contain there integer s, e, m .

Output

If you can jump from s to e, with less or equal m power output “Yes”, else output “No”

Sample Input

Raw3 31 2 31 3 21 2 1

Sample Output

RawYesYesNo

Hint

     Abs(a-b) mean the absolute value of a-b.

Source

     SWUST 7th ACM/ICPC Programming Contest - 2011

///这道题开始以为用dfs搜一遍就可以了,但忽略了这道题是有q组数据,毫无意外的tle,后来在同学的提醒下想到了预处理所有区间,O(1)
查询即可,附上超时代码和ac代码,并以此为鉴。

///超时代码#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>#define INF 0x7f7f7f7f#define maxn 1005using namespace std;typedef long long LL;int a[210];bool vis[210],flag;void dfs(int s,int e,int m){    if(flag)        return ;    if(s==e&&m>=0)    {        flag=true;        return ;    }    for(int i=s+1;i<=e;i++)    {        dfs(i,e,m-abs(a[i]-a[s])*abs(i-s));    }}int main(){    int n,q,s,e,m;    while(~scanf("%d%d",&n,&q))    {        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        while(q--)        {            flag=false;            scanf("%d%d%d",&s,&e,&m);            dfs(s,e,m);            if(flag)                printf("Yes\n");            else                printf("No\n");        }    }    return 0;}///ac代码,动态规划#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<iostream>#define INF 0x7f7f7f7f#define N 205using namespace std;int main(){    int n,q,dp[N][N];    while(scanf("%d%d",&n,&q)!=EOF)    {        int a[N];        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);        }        for(int i=0;i<n;i++)            for(int j=0;j<n;j++)                dp[i][j]=abs(a[i]-a[j])*abs(i-j);///dp保存的是从i到j需要的代价            for(int k=0;k<n;k++)                for(int i=0;i<n;i++)                    for(int j=0;j<n;j++)                        if(dp[i][k]+dp[k][j]<dp[i][j])                            dp[i][j]=dp[i][k]+dp[k][j];///最重要的状态转移,容易想到,代表中间可能经过k点,到达终点            while(q--)            {                int s,e,m;                scanf("%d%d%d",&s,&e,&m);                if(dp[s-1][e-1]<=m)                    printf("Yes\n");                else                    printf("No\n");            }    }    return 0;}
0 0
原创粉丝点击