【DP 训练】Alibaba, ACM/ICPC SEERC 2004, UVa1632

#include
using namespace std;
#define maxn 10010
#define INF 100000000
int n,a[maxn],d[maxn];
int dp[maxn][maxn][2];
int main()
{
	while(~scanf("%d",&n))
	{
		for(int i=1;i<=n;i++)
			scanf("%d%d",&a[i],&d[i]);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				dp[i][j][0]=dp[i][j][1]=INF;
			}
		}
		for(int i=1;i<=n;i++)dp[i][i][0]=dp[i][i][1]=0;
		for(int len=2;len<=n;len++)
		{
			for(int l=1;l+len-1<=n;l++)
			{
				int r = l+len-1;
				dp[l][r][1] = min(dp[l][r-1][0]+(a[r]-a[l]),dp[l][r-1][1]+(a[r]-a[r-1]));
				if(dp[l][r][1]>=d[r])dp[l][r][1]=INF;
				dp[l][r][0] = min(dp[l+1][r][0]+(a[l+1]-a[l]),dp[l+1][r][1]+(a[r]-a[l]));
				if(dp[l][r][0]>=d[l])dp[l][r][0]=INF;						
			}
		}
		int ans = min(dp[1][n][0],dp[1][n][1]);
		if(ans==INF)cout<<"No solution"<

你可能感兴趣的:(算法与数学)