zoukankan      html  css  js  c++  java
  • 动态规划入门:热血实战!

    ___________________________________最好的旅行,是在陌生的地方,发现了一种久违的感动。

    1.poj 3624

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    int w[3403],d[3403],dp[12881],n,m;  //注意dp数组的范围要开大!否则的话无法AC!会显示runtime error的!
    int main()
    {
    	memset(dp,0,sizeof(dp)); //dp数组的意义要明确是神木!:在这样总重量的条件下的期望值的最大值!
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>w[i]>>d[i];
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=m;j>=w[i];j--) 
    			dp[j]=max(dp[j],dp[j-w[i]]+d[i]);
    	}
    	cout<<dp[m]<<endl;
    	return 0;
    }
    

    2.poj 1141

     0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)

    #include<iostream>
    #include<cstdio>
    #include<string.h>
    
    using namespace std;
    #define MAXN 256
    char br[MAXN];
    int dp[MAXN][MAXN],pos[MAXN][MAXN];
    int len;
    
    void print_br(int i,int j)
    {
        if(i>j) return;
        if(i==j)
        {
            if(br[i]=='(' || br[j]==')') printf("()");
            else printf("[]");
        }
        else if(pos[i][j]==-1)
        {
            printf("%c",br[i]);
            print_br(i+1,j-1);
            printf("%c",br[j]);
        }
        else
        {
            print_br(i,pos[i][j]);
            print_br(pos[i][j]+1,j);
        }
    }
    
    bool match(int i,int j)
    {
        if(br[i]=='(' && br[j]==')') return true;
        if(br[i]=='[' && br[j]==']') return true;
        return false;
    }
    
    int main()
    {
        int i,j,k,mid,t;
        while(gets(br)!=NULL)
        {
            memset(dp,0,sizeof(dp));
    
            len=strlen(br);
            for(i=0;i<len;i++) dp[i][i]=1;
    
            for(k=1;k<len;k++)
            {
                for(i=0;i+k<len;i++)
                {
                    j=i+k;
                    dp[i][j]=0x7fffffff;
                    if(match(i,j))
                    {
                        dp[i][j]=dp[i+1][j-1];
                        pos[i][j]=-1; //莫失莫忘,先寿永昌! 
                    }
                    for(mid=i;mid<j;mid++)
                    {
                        t=dp[i][mid]+dp[mid+1][j];
                        if(dp[i][j]>t)
                        {
                            dp[i][j]=t;
                            pos[i][j]=mid;
                        }
                    }
                }
            }
            print_br(0,len-1);
            printf("
    ");
        }
        return 0;
    }

    ————————————————————————————————https://blog.csdn.net/non_cease/article/details/6870034

    3.https://vjudge.net/contest/316500#problem/C

  • 相关阅读:
    Eclipse查看源码
    让你的Eclipse的智能感知也和Visual Studio 一样快
    关于The serializable class XXX does not declare a static final serialVersionUID field of type long的警告
    C#中Dictionary的用法及用途实例
    不想人工干预地自动执行存储过程?当目的表发生变动时自动执行相应的存储过程?
    再说HelloWorld
    TreeList应用(三) 收藏
    DataTable转换为List<Model>的通用类
    U盘不显示盘符
    如何在 Eclipse 中显示行号
  • 原文地址:https://www.cnblogs.com/dragondragon/p/11290162.html
Copyright © 2011-2022 走看看