noip 烏龜棋

滾動數組

//圖論?因爲只有四種顏色,因此,一個點連四條邊
//數據保證到達終點時剛好用光 MM 張爬行卡片。??這就比較麻煩了
//回憶之前做過的搜索題
//f[i][j],j表示已經用了幾張牌了
//表示每張牌還有幾張f[][p][q][u][v]
//begin
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[352],b,f[5][41][41][41][41];///////////空間超了。。 
int p,q,u,v; 
int main()
{
//  freopen("tortoise8.in","r",stdin);

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int j=1;j<=m;j++)
    {
        scanf("%d",&b);
        if(b==1)
            p++;
        else if(b==2)
            q++;
        else if(b==3)
            u++;
        else
            v++;
    }
    memset(f,0x80,sizeof f);
    f[1][v][u][q][p]=a[1];
//  cout<<v<<","<<u<<","<<q<<","<<p<<endl;
    //滾動數組 ,那結果是什麼呢? 
    for(int i=2;i<=n;i++)
        for(int vi=v;vi>=0;vi--)
            for(int ui=u;ui>=0;ui--)
                for(int qi=q;qi>=0;qi--)
                    for(int pi=p;pi>=0;pi--)
                    {
                        if(i-4>=1 && vi+1<=v)
                            f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-4)%5][vi+1][ui][qi][pi]+a[i]);       
                        if(i-3>=1 && ui+1<=u)
                            f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-3)%5][vi][ui+1][qi][pi]+a[i]);
                        if(i-2>=1 && qi+1<=q)
                            f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-2)%5][vi][ui][qi+1][pi]+a[i]);
                        if(i-1>=1 && pi+1<=p)
                            f[i%5][vi][ui][qi][pi]=max(f[i%5][vi][ui][qi][pi],f[(i-1)%5][vi][ui][qi][pi+1]+a[i]);               
//                          cout<<i<<","<<vi<<","<<ui<<","<<qi<<","<<pi<<","<<f[i%5][vi][ui][qi][pi]<<endl; 
                    } //f[2][0][1][1][0]

    cout<<f[n%5][0][0][0][0]<<endl;     
}
//圖論?因爲只有四種顏色,因此,一個點連四條邊
//數據保證到達終點時剛好用光 MM 張爬行卡片。??這就比較麻煩了
//回憶之前做過的搜索題
//f[i][j],j表示已經用了幾張牌了
//表示每張牌還有幾張f[][p][q][u][v]
//begin
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,a[352],b,f[41][41][41][41];///////////空間超了。。 
int p,q,u,v; 
int main()
{
//  freopen("tortoise10.in","r",stdin);

    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int j=1;j<=m;j++)
    {
        scanf("%d",&b);
        if(b==1)
            p++;
        else if(b==2)
            q++;
        else if(b==3)
            u++;
        else
            v++;
    }
    memset(f,0x80,sizeof f);
    f[v][u][q][p]=a[1];
//  cout<<v<<","<<u<<","<<q<<","<<p<<endl;
    //滾動數組 ,那結果是什麼呢? 
//  for(int i=2;i<=n;i++)
        for(int vi=v;vi>=0;vi--)
        {   
            for(int ui=u;ui>=0;ui--)
            {
                for(int qi=q;qi>=0;qi--)
                {
                    for(int pi=p;pi>=0;pi--)
                    {
                        int i=(v-vi)*4+(u-ui)*3+(q-qi)*2+(p-pi)*1+1;
                        if(vi+1<=v)
                            f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi+1][ui][qi][pi]+a[i]);      
                        if( ui+1<=u)
                            f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi][ui+1][qi][pi]+a[i]);
                        if( qi+1<=q)
                            f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi][ui][qi+1][pi]+a[i]);
                        if(pi+1<=p)
                            f[vi][ui][qi][pi]=max(f[vi][ui][qi][pi],f[vi][ui][qi][pi+1]+a[i]);              
//                          cout<<i<<","<<vi<<","<<ui<<","<<qi<<","<<pi<<","<<f[vi][ui][qi][pi]<<endl; 
                    } //f[2][0][1][1][0]
                }       
            }               
        }               
    cout<<f[0][0][0][0]<<endl;      
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章