jzoj1758-过河【dp】
生活随笔
收集整理的這篇文章主要介紹了
jzoj1758-过河【dp】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目大意
nnn個木板第iii個浮起來aisa_i\ sai??s后沉bisb_i sbi?s如此反復(fù)。
每sss最多可以跨555格,最短時間到達右邊。
解題思路
設(shè)fi,jf_{i,j}fi,j?表示在第isi\ si?s的時候是否可以到達第jjj格木板
然后顯而易見fi,j=fi,k(∣k?j∣≤5)f_{i,j}=f_{i,k}(|k-j|\leq 5)fi,j?=fi,k?(∣k?j∣≤5)
滾動一下然后暴力判斷如果進行了很多次就無解
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1100; int G,t,a[N],b[N],f[2][N],n; int main() {freopen("riv9.in","r",stdin);scanf("%d",&G);while(G--){scanf("%d",&n);memset(b,0,sizeof(b));for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);memset(f,0,sizeof(f));t=1;f[1][0]=1;n++;a[0]=1;a[n]=1;bool flag;while(!f[t&1][n]){flag=1;for(int i=0;i<=n;i++){if(!f[t&1][i]) continue;flag=0;for(int j=-5;j<=5;j++){int z=i+j;if(z<0||z>n) continue;if((t-1)%(a[z]+b[z])+1>a[z]) continue;f[~t&1][z]=1;}}if(t>10000000/n) flag=1;if(flag) break;memset(f[t&1],0,sizeof(f[t&1]));t++;}if(flag) printf("No\n");else printf("%d\n",t-1);} }總結(jié)
以上是生活随笔為你收集整理的jzoj1758-过河【dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 准大学生笔记本电脑选购攻略大学生笔记本电
- 下一篇: jzoj4669-[NOIP2016提高