zoukankan      html  css  js  c++  java
  • bzoj 1571: [Usaco2009 Open]滑雪课Ski【dp】

    参考:https://blog.csdn.net/cgh_andy/article/details/52506738
    没有get到什么重点的dp……做的莫名其妙
    注意滑雪一个坡可以滑很多次
    设f[i][j]为时间为i能力为j的最大滑雪次数,预处理l[i][j]为在i时获得j能力的最晚开始时间,w[i]为有能力j时最短的能滑雪时间
    模拟转移即可

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int N=10005,M=105;
    int l[N][M],n,t,m,f[N][M],w[M],g[N];  
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int main()  
    {
        t=read(),m=read(),n=read();
        for(int i=0;i<=t;i++)
    		for(int j=0;j<=100;j++)
    			f[i][j]=-1e9;
    	for(int i=0;i<=100;i++)
    		w[i]=1e9;
    	// memset(f,128,sizeof f);
        // memset(w,127/3,sizeof w);cerr<<f[0][0]<<" "<<f[0][1]<<" "<<w[0]<<" "<<w[1]<<endl;
        for(int i=1;i<=m;i++)  
        {
    		int x=read(),y=read()+x,z=read();
            l[y][z]=max(l[y][z],x);  
        }  
        for(int i=1;i<=n;i++)  
        {  
            int x=read(),y=read();
            for(int j=x;j<=100;j++)
    			w[j]=min(w[j],y);  
        }  
        f[0][1]=0;  
        for(int i=1;i<=t;i++)  
    		for(int j=1;j<=100;j++)  
    		{  
    			f[i][j]=f[i-1][j];  
    			if(l[i][j])
    				f[i][j]=max(f[i][j],g[l[i][j]]);  
    			if(i-w[j]>=0)
    				f[i][j]=max(f[i][j],f[i-w[j]][j]+1);  
    			g[i]=max(g[i],f[i][j]);  
    		}  
        printf("%d
    ",g[t]);  
        return 0;  
    }
    
  • 相关阅读:
    最大流模板
    大数相加
    . Number throry
    掷骰子 dp
    Java常用类库2
    简单注册功能(未连接数据库)
    Java常用类库
    人机猜拳
    租车系统
    Java一些概念
  • 原文地址:https://www.cnblogs.com/lokiii/p/8988884.html
Copyright © 2011-2022 走看看