2016 UESTC Training for Dynamic Programming(1)

4 篇文章 0 订阅

A 柱爷与咸鱼神功
裸的背包,蛤蛤蛤

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int f[5005][5005],n,m,t[5005],v[5005],lala;
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&t[i],&v[i]);
    }
    for (int i=1;i<=m;i++)
        for (int j=1;j<=n;j++)
        {
            if (j>=t[i]) f[i][j]=max(f[i-1][j],f[i-1][j-t[i]]+v[i]);
            else f[i][j]=f[i-1][j];
        }
    printf("%d",f[m][n]);
}

B 柱爷与最大区间和
正着搞一遍,反着搞一遍就A了

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int a[500005],w[500005],f[500005],n,alala;
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    for (int i=1;i<=n;i++)
    {
        f[i]=a[i];
        if (f[i-1]>=0) f[i]+=f[i-1];
    }
    for (int i=n;i>=1;i--)
    {
        w[i]=a[i];
        if (w[i+1]>=0) w[i]+=w[i+1];
    }
    for (int i=2;i<=n;i++)
    {
        f[i]=max(f[i-1],f[i]);
    }
    for (int i=n-1;i>=1;i--)
    {
        w[i]=max(w[i+1],w[i]);
    }
    int ans=-200000000;
    for (int i=2;i<n;i++)
    {
        ans=max(ans,f[i-1]+w[i+1]);
    }
    printf("%d",ans);
}

C 柱爷的下凡
无敌打表,蛤蛤蛤,我去他的400ms

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int ans1[205],ans2[205],lalalalal,fa;
void chushihua()
{
    ans1[1]=2,ans2[1]=3;
    ans1[2]=2,ans2[2]=3;
    ans1[3]=2,ans2[3]=3;
    ans1[4]=2,ans2[4]=3;
    ans1[5]=2,ans2[5]=3;
    ans1[6]=2,ans2[6]=3;
    ans1[7]=2,ans2[7]=5;
    ans1[8]=3,ans2[8]=4;
    ans1[9]=3,ans2[9]=4;
    ans1[10]=2,ans2[10]=5;
    ans1[11]=2,ans2[11]=5;
    ans1[12]=4,ans2[12]=6;
    ans1[13]=4,ans2[13]=6;
    ans1[14]=4,ans2[14]=6;
    ans1[15]=3,ans2[15]=7;
    ans1[16]=4,ans2[16]=6;
    ans1[17]=3,ans2[17]=7;
    ans1[18]=4,ans2[18]=6;
    ans1[19]=3,ans2[19]=8;
    ans1[20]=3,ans2[20]=8;
    ans1[21]=5,ans2[21]=7;
    ans1[22]=4,ans2[22]=9;
    ans1[23]=4,ans2[23]=9;
    ans1[24]=5,ans2[24]=8;
    ans1[25]=5,ans2[25]=8;
    ans1[26]=5,ans2[26]=8;
    ans1[27]=5,ans2[27]=8;
    ans1[28]=4,ans2[28]=9;
    ans1[29]=5,ans2[29]=8;
    ans1[30]=5,ans2[30]=8;
    ans1[31]=4,ans2[31]=9;
    ans1[32]=5,ans2[32]=8;
    ans1[33]=5,ans2[33]=8;
    ans1[34]=7,ans2[34]=11;
    ans1[35]=7,ans2[35]=11;
    ans1[36]=7,ans2[36]=11;
    ans1[37]=5,ans2[37]=12;
    ans1[38]=5,ans2[38]=12;
    ans1[39]=5,ans2[39]=12;
    ans1[40]=7,ans2[40]=11;
    ans1[41]=5,ans2[41]=12;
    ans1[42]=5,ans2[42]=12;
    ans1[43]=5,ans2[43]=12;
    ans1[44]=7,ans2[44]=11;
    ans1[45]=7,ans2[45]=11;
    ans1[46]=7,ans2[46]=11;
    ans1[47]=7,ans2[47]=11;
    ans1[48]=6,ans2[48]=14;
    ans1[49]=6,ans2[49]=14;
    ans1[50]=6,ans2[50]=14;
    ans1[51]=6,ans2[51]=14;
    ans1[52]=8,ans2[52]=13;
    ans1[53]=8,ans2[53]=13;
    ans1[54]=8,ans2[54]=13;
    ans1[55]=8,ans2[55]=13;
    ans1[56]=8,ans2[56]=13;
    ans1[57]=6,ans2[57]=14;
    ans1[58]=6,ans2[58]=14;
    ans1[59]=6,ans2[59]=14;
    ans1[60]=8,ans2[60]=13;
    ans1[61]=8,ans2[61]=13;
    ans1[62]=6,ans2[62]=14;
    ans1[63]=6,ans2[63]=14;
    ans1[64]=6,ans2[64]=14;
    ans1[65]=8,ans2[65]=13;
    ans1[66]=8,ans2[66]=13;
    ans1[67]=8,ans2[67]=13;
    ans1[68]=8,ans2[68]=13;
    ans1[69]=7,ans2[69]=17;
    ans1[70]=7,ans2[70]=17;
    ans1[71]=7,ans2[71]=17;
    ans1[72]=7,ans2[72]=17;
    ans1[73]=7,ans2[73]=17;
    ans1[74]=9,ans2[74]=14;
    ans1[75]=7,ans2[75]=17;
    ans1[76]=7,ans2[76]=17;
    ans1[77]=7,ans2[77]=17;
    ans1[78]=7,ans2[78]=17;
    ans1[79]=7,ans2[79]=17;
    ans1[80]=10,ans2[80]=16;
    ans1[81]=10,ans2[81]=16;
    ans1[82]=10,ans2[82]=16;
    ans1[83]=10,ans2[83]=16;
    ans1[84]=8,ans2[84]=19;
    ans1[85]=8,ans2[85]=19;
    ans1[86]=8,ans2[86]=19;
    ans1[87]=8,ans2[87]=19;
    ans1[88]=6,ans2[88]=20;
    ans1[89]=10,ans2[89]=17;
    ans1[90]=11,ans2[90]=15;
    ans1[91]=11,ans2[91]=15;
    ans1[92]=11,ans2[92]=15;
    ans1[93]=11,ans2[93]=15;
    ans1[94]=11,ans2[94]=18;
    ans1[95]=11,ans2[95]=18;
    ans1[96]=12,ans2[96]=19;
    ans1[97]=12,ans2[97]=19;
    ans1[98]=12,ans2[98]=19;
    ans1[99]=12,ans2[99]=19;
    ans1[100]=12,ans2[100]=19;
    ans1[101]=12,ans2[101]=19;
    ans1[102]=12,ans2[102]=19;
    ans1[103]=12,ans2[103]=19;
    ans1[104]=12,ans2[104]=19;
    ans1[105]=12,ans2[105]=19;
    ans1[106]=12,ans2[106]=19;
    ans1[107]=12,ans2[107]=19;
    ans1[108]=12,ans2[108]=19;
    ans1[109]=12,ans2[109]=19;
    ans1[110]=12,ans2[110]=19;
    ans1[111]=13,ans2[111]=18;
    ans1[112]=12,ans2[112]=19;
    ans1[113]=12,ans2[113]=19;
    ans1[114]=12,ans2[114]=19;
    ans1[115]=12,ans2[115]=19;
    ans1[116]=12,ans2[116]=19;
    ans1[117]=12,ans2[117]=19;
    ans1[118]=12,ans2[118]=19;
    ans1[119]=12,ans2[119]=19;
    ans1[120]=12,ans2[120]=19;
    ans1[121]=12,ans2[121]=19;
    ans1[122]=12,ans2[122]=19;
    ans1[123]=7,ans2[123]=23;
    ans1[124]=7,ans2[124]=23;
    ans1[125]=8,ans2[125]=27;
    ans1[126]=8,ans2[126]=27;
    ans1[127]=8,ans2[127]=27;
    ans1[128]=9,ans2[128]=23;
    ans1[129]=9,ans2[129]=23;
    ans1[130]=9,ans2[130]=23;
    ans1[131]=9,ans2[131]=30;
    ans1[132]=9,ans2[132]=30;
    ans1[133]=14,ans2[133]=22;
    ans1[134]=14,ans2[134]=22;
    ans1[135]=10,ans2[135]=26;
    ans1[136]=14,ans2[136]=22;
    ans1[137]=8,ans2[137]=27;
    ans1[138]=8,ans2[138]=27;
    ans1[139]=14,ans2[139]=22;
    ans1[140]=8,ans2[140]=27;
    ans1[141]=8,ans2[141]=27;
    ans1[142]=10,ans2[142]=26;
    ans1[143]=8,ans2[143]=27;
    ans1[144]=8,ans2[144]=27;
    ans1[145]=8,ans2[145]=27;
    ans1[146]=8,ans2[146]=27;
    ans1[147]=8,ans2[147]=27;
    ans1[148]=8,ans2[148]=27;
    ans1[149]=8,ans2[149]=27;
    ans1[150]=8,ans2[150]=27;
    ans1[151]=8,ans2[151]=27;
    ans1[152]=8,ans2[152]=27;
    ans1[153]=9,ans2[153]=30;
    ans1[154]=9,ans2[154]=30;
    ans1[155]=9,ans2[155]=30;
    ans1[156]=9,ans2[156]=30;
    ans1[157]=9,ans2[157]=30;
    ans1[158]=9,ans2[158]=30;
    ans1[159]=9,ans2[159]=30;
    ans1[160]=9,ans2[160]=30;
    ans1[161]=9,ans2[161]=30;
    ans1[162]=9,ans2[162]=30;
    ans1[163]=9,ans2[163]=30;
    ans1[164]=9,ans2[164]=30;
    ans1[165]=9,ans2[165]=30;
    ans1[166]=9,ans2[166]=30;
    ans1[167]=9,ans2[167]=30;
    ans1[168]=9,ans2[168]=30;
    ans1[169]=9,ans2[169]=30;
    ans1[170]=9,ans2[170]=30;
    ans1[171]=9,ans2[171]=30;
    ans1[172]=12,ans2[172]=31;
    ans1[173]=12,ans2[173]=31;
    ans1[174]=12,ans2[174]=31;
    ans1[175]=12,ans2[175]=31;
    ans1[176]=10,ans2[176]=34;
    ans1[177]=10,ans2[177]=34;
    ans1[178]=10,ans2[178]=34;
    ans1[179]=10,ans2[179]=33;
    ans1[180]=10,ans2[180]=34;
    ans1[181]=10,ans2[181]=34;
    ans1[182]=10,ans2[182]=34;
    ans1[183]=10,ans2[183]=34;
    ans1[184]=10,ans2[184]=34;
    ans1[185]=10,ans2[185]=34;
    ans1[186]=10,ans2[186]=34;
    ans1[187]=10,ans2[187]=34;
    ans1[188]=12,ans2[188]=31;
    ans1[189]=12,ans2[189]=31;
    ans1[190]=12,ans2[190]=31;
    ans1[191]=12,ans2[191]=31;
    ans1[192]=12,ans2[192]=31;
    ans1[193]=12,ans2[193]=31;
    ans1[194]=12,ans2[194]=31;
    ans1[195]=12,ans2[195]=31;
    ans1[196]=12,ans2[196]=31;
    ans1[197]=17,ans2[197]=27;
    ans1[198]=12,ans2[198]=31;
    ans1[199]=12,ans2[199]=31;
    ans1[200]=12,ans2[200]=31;
}
int main()
{
    chushihua();
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        scanf("%d",&n);
        printf("1 %d %d\n",ans1[n],ans2[n]);
    }
}

D 柱爷的恋爱
只要每个时候的前括号数都大于后括号数就满足了,方法:dfs

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
int len;
long long dp[305][305],lalal;
char s[305];
ll dfs(int a,int b)
{
    ll& res=dp[a][b];
    if (res==-1)
    {
        if (a==b)
        {
            res=1;
        }
        else
        {
            res=0;
            char c='1';
            if (s[a]=='[')
            {
                c=']';
            }
            if (s[a]=='(')
            {
                c=')';
            }
            if (c!='1')
            {
                for (int i=a+1;i<b;i++)
                {
                    if (s[i]==c)
                    {
                        res=(res+dfs(a+1,i)*dfs(i+1,b))%mod;
                    }
                }
            }
            res=(res+dfs(a+1,b))%mod;
        }
    }
    return res;
}
int main()
{
    scanf("%d\n",&len);
    scanf("%s",s);
    for (int i=0;i<=len;i++)
    for (int j=0;j<=len;j++)
    {
        dp[i][j]=-1;
    }
    printf("%lld\n",dfs(0,len)-1);
}

E 柱爷与远古法阵
高斯消元get,在每周算法讲堂上有这道题的详解.

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#define eps 1e-14
using namespace std;
long double a[505][505],lalala;
int n,m,fa[505];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
        fa[i]=i;
    }
    for (int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        fa[x]=y;
    }
    for (int i=1;i<n;i++)
    {
        a[i][i]=6;
        if (fa[i]!=i) a[i][fa[i]]=-6;
        else
        {
            a[i][n+1]=6;
            for (int j=1;j<=6;j++)
            {
                if (i+j<=n) a[i][i+j]=-1.0;
                else a[i][i]-=1.0;
            }
        }
    }
    a[n][n]=1.0;
    a[n][n+1]=0;
    for (int i=1;i<=n;i++)
    {
        int p=i;
        for (int j=i+1;j<=n;j++)
        {
            if(fabs(a[j][i])>eps)
            {
                p=j;
            }
        }
        if (fabs(a[p][i])>eps)
        {
            for (int j=i;j<=n+1;j++)
            {
                swap(a[i][j],a[p][j]);
            }
            for (int j=i+1;j<=n;j++)
            {
                if (fabs(a[j][i])>eps)
                {
                    long double k=a[j][i]/a[i][i];
                    for (int t=i;t<=n+1;t++) a[j][t]-=a[i][t]*k;  
                }
            }
        }
    }
    for(int i=n; i>=1; i--)  
    {  
        for(int j=i+1; j<=n; j++) if(fabs(a[i][j])>eps)  
            a[i][n+1]-=a[i][j]*a[j][n+1];  
        if(abs(a[i][i])<=eps&&abs(a[i][n+1])>eps)  
        {  
            printf("-1\n");  
            return 0;  
        }  
        a[i][n+1]/=a[i][i];  
    }  
    printf("%.12Lf",a[1][n+1]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值