poj 1718 River Crossing

来源:互联网 发布:micropython 单片机 编辑:程序博客网 时间:2024/05/16 10:58

题目链接:http://poj.org/problem?id=1718

题目思路:表示自己是通过提交试出的上界,不知道标准做法是什么,求最小公位数那个方法我无法证明其正确性,哎,不管了,AC才是王道。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define Max 110int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}int dp[2][1010],t,a[1010],b[1010];int main(){    int i,j,k,tmp,rec,n;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(i=1;i<=n;i++)            scanf("%d%d",&a[i],&b[i]);        tmp=0;       // memset(dp[tmp],0,sizeof(dp[tmp]));       for(i=0;i<=n+1;i++) dp[0][i]=0;        dp[0][0]=1;        rec=inf;        for(i=0;i<=n;i++)        {           // memset(dp[1-tmp],0,sizeof(dp[1-tmp]));            for(j=0;j<=n+1;j++) dp[1-tmp][j]=0;            for(j=0;j<=n+1;j++)            {                if(j==0||j>n||(i%(a[j]+b[j])>=1&&i%(a[j]+b[j])<=a[j]))                {                    for(k=j-1;j-k<=5&&k>=0;k--)                    {                        if(dp[tmp][k])                        {                            dp[1-tmp][j]=1;                            break;                        }                    }                    if(dp[1-tmp][j])    continue;                    for(k=j;k<=n+1&&k-j<=5;k++)                    {                        if(dp[tmp][k])                        {                            dp[1-tmp][j]=1;                            break;                        }                    }                }            }            if(dp[1-tmp][n+1])            {                rec=i;                break;            }            tmp=1-tmp;        }        if(rec!=inf)        printf("%d\n",rec);        else        printf("NO\n");    }}


原创粉丝点击