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