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