PKU1160 & HDU3305

PKU1160

#include<iostream>
#include
<algorithm>
using namespace std;
int x[320];
int dp[320][32];
int f[320][320];
int s[320][320];
int main()
{
    
int i,j,k;
    
int v,p;
    scanf(
"%d%d",&v,&p);
    
for(i=1;i<=v;++i)
        scanf(
"%d",&x[i]);
    
for(i=1;i<=v;++i)
    {
        
for(j=i+1;j<=v;++j)
        {
            f[i][j]
=0;
            
int s=(i+j)/2;
            
for(k=i;k<=j;++k)
                f[i][j]
+=abs(x[s]-x[k]);
        }
    }
    memset(dp,
-1,sizeof(dp));
    
for(i=1;i<=v;++i)
    {
        dp[i][
1]=f[1][i];
        s[i][
1]=1;
    }
    
for(j=2;j<=p;++j)
    {
        
for(k=s[v][j-1];k<v;++k)
        {
            
if(dp[v][j]==-1||dp[k][j-1]+f[k+1][v]<dp[v][j])
            {
                dp[v][j]
=dp[k][j-1]+f[k+1][v];
                s[v][j]
=k;
            }
        }
        
for(i=v-1;i>0;--i)
        {

            for(k=s[i][j-1];k<=s[i+1][j];++k)
                
if(dp[i][j]==-1||dp[k][j-1]+f[k+1][i]<dp[i][j])
                {
                    dp[i][j]
=dp[k][j-1]+f[k+1][i];
                    s[i][j]
=k;
                }
        }
    }
    printf(
"%d\n",dp[v][p]);
    
return 0;
}
HDU3305

#include<iostream>
using namespace std;
const int MAX=1245;
int a[MAX];
long long sqr[MAX];
long long sum[MAX];
long long dp[MAX][MAX];
int s[MAX][MAX];

long long val(int i,int j)
{
    
return ((sum[j]-sum[i-1])*(sum[j]-sum[i-1])-(sqr[j]-sqr[i-1]))/2;
}

int main()
{
    
int n,m;
    
while(scanf("%d%d",&n,&m),n||m)
    {
        
++m;
        sqr[
0]=0;sum[0]=0;
        
for(int i=1;i<=n;++i)
        {
            scanf(
"%d",&a[i]);
            sum[i]
=sum[i-1]+a[i];
            sqr[i]
=sqr[i-1]+a[i]*a[i];
        }
        
for(int i=1;i<=n;++i)
        {
            dp[i][
1]=val(1,i);
            s[i][
1]=1;
        }
        
for(int i=2;i<=m;++i)
        {
            dp[n][i]
=-1;
            
for(int k=s[n][i-1];k<n;++k)
            {
                
if(dp[n][i]==-1||dp[k][i-1]+val(k+1,n)<dp[n][i])
                {
                    dp[n][i]
=dp[k][i-1]+val(k+1,n);
                    s[n][i]
=k;
                }
            }
            
for(int j=n-1;j>0;--j)
            {
                dp[j][i]
=-1;
                
for(int k=s[j][i-1];k<=s[j+1][i];++k)
                {
                    
if(dp[j][i]==-1||dp[k][i-1]+val(k+1,j)<dp[j][i])
                    {
                        dp[j][i]
=dp[k][i-1]+val(k+1,j);
                        s[j][i]
=k;
                    }
                }
            }
        }
        printf(
"%lld\n",dp[n][m]);
    }
    
return 0;
}
posted @ 2009-08-02 20:10  unber  阅读(301)  评论(0)    收藏  举报