6 3 5 9 12 15 17 6 3 5 9 12 30 40
3 -1
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100000+100;
const int inf=199999999;
int dp[12][maxn];
int a[maxn];
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(dp,-1,sizeof(dp));
dp[1][2]=0;
for(int i=3;i<=n;i++)
{
for(int j=1;j<=10;j++)
{
if(i-j>=1&&a[i]-a[i-j]<=10)
{
for(int k=1;k<=10;k++)
{
if(i-j-k>=1&&a[i]-a[i-j-k]<=10)
{
if(dp[k][i-j]!=-1)//判断是否存在一个在第i-j个位置,一个在i-j-k个位置
{
if(dp[j][i]==-1)
{
dp[j][i]=dp[k][i-j]+1;
}
else
{
dp[j][i]=min(dp[j][i],dp[k][i-j]+1);
}
}
}
}
}
else
break;
}
}
int ans=inf;
for(int i=1;i<=10;i++)
if(dp[i][n]!=-1)
ans=min(ans,dp[i][n]);
if(ans==inf)
printf("-1\n");
else
printf("%d\n",ans);
}
return 0;
}
原文地址:http://blog.csdn.net/caduca/article/details/43407185