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;
}