算法競賽進階指南 線性dp

1.poj2279
思路:線性dp,但過不了poj上的樣例,會爆內存,,實驗只能去Acwing上實驗。最後一個last元素可以嘗試每一排,但是有個界限狀態的要點我覺得應該把初始狀態設爲dp[1][0][0][0][0]=1應該比dp00000更好理解個人認爲。。要開Long Long 在這裏插入圖片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 31;
ll dp[N][N][N][N][N];
int n,k;
int main()
{
    while(scanf("%d",&n),n){
       int s[6]={0};
       for(int i=0;i<n;i++){
            scanf("%d",&s[i]);
       }
       memset(dp,0,sizeof dp);
       dp[1][0][0][0][0]=1;
        for(int a=0;a<=s[0];a++)
        for(int b=0;b<=min(a,s[1]);b++)
        for(int c=0;c<=min(b,s[2]);c++)
        for(int d=0;d<=min(c,s[3]);d++)
        for(int e=0;e<=min(s[4],d);e++){
            ll &v=dp[a][b][c][d][e];
            if(a-1>=b)v+=dp[a-1][b][c][d][e];
            if(b-1>=c)v+=dp[a][b-1][c][d][e];
            if(c-1>=d)v+=dp[a][b][c-1][d][e];
            if(d-1>=e)v+=dp[a][b][c][d-1][e];
            if(e)v+=dp[a][b][c][d][e-1];
        }
       printf("%lld\n",dp[s[0]][s[1]][s[2]][s[3]][s[4]]);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章