题目: http://poj.org/problem?id=3486
题解: dp[i]为前i年都有电脑用的最小花费,那么dp[i]=min(dp[j-1]+c+a[j][i]),即前j-1年有电脑用的最小花费加上买第j年电脑一直用到第i年的花费中取一个最小值。
代码:
#include<stdio.h>
#include<string.h>
const int N=1005;
int dp[N],a[N][N];
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int main()
{
int c,i,j;
while(scanf("%d",&c)!=EOF)
{
int n;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
scanf("%d",&a[i][j]);
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
dp[i]=min(dp[i],dp[j-1]+c+a[j][i]);
}
}
printf("%d\n",dp[n]);
}
return 0;
}