xfstart07
Get busy living or get busy dying

O(FV^2)
#include<iostream>
using namespace std;

int n,m;
int a[110][110];
int f[110][110];
int p[110][110];
int main()
{
    scanf(
"%d%d",&n,&m);
    
for(int i=1;i<=n;++i)
        
for(int j=1;j<=m;++j)
            scanf(
"%d",&a[i][j]);
    memset(f,
128,sizeof(f));
    
for(int i=0;i<=m;++i)
        f[
0][i]=0;
    
for(int i=1;i<=n;++i)
        
for(int j=i;j<=m;++j){
            f[i][j]
=f[i][j-1];
            p[i][j]
=p[i][j-1];
            
for(int k=i;k<=j;++k)
                
if(f[i][j]<f[i-1][k-1]+a[i][k]){
                    f[i][j]
=f[i-1][k-1]+a[i][k];
                    p[i][j]
=k;
                }
        }
    printf(
"%d\n",f[n][m]);
    
int ans[110],l=0;
    
int j=p[n][m];
    
for(int i=n;i>=1;--i){
        ans[
++l]=j;
        j
=p[i-1][j-1];
    }
    
for(int i=l;i>1;--i)
        printf(
"%d ",ans[i]);
    printf(
"%d\n",ans[1]);
    
return 0;
}


O(FV)
#include<iostream>
using namespace std;

int n,m;
int a[110][110];
int f[110][110];
int b[110][110];
int main()
{
    scanf(
"%d%d",&n,&m);
    
for(int i=1;i<=n;++i)
        
for(int j=1;j<=m;++j)
            scanf(
"%d",&a[i][j]);
    
for(int i=0;i<=n;++i)
        
for(int j=0;j<=m;++j)
            f[i][j]
=b[i][j]=0;
    
int tmp;
    
for(int i=1;i<=n;++i){
        f[i][i]
=f[i-1][i-1]+a[i][i];
        b[i][i]
=1;
        
for(int j=i+1;j<=m-(n-i);++j){
            tmp
=f[i-1][j-1]+a[i][j];
            
if(tmp>f[i][j-1]){
                f[i][j]
=tmp;
                b[i][j]
=1;
            }
            
else
                f[i][j]
=f[i][j-1];
        }
    }
    printf(
"%d\n",f[n][m]);
    
int ans[110],i=n;
    
for(int j=m;j>=1;--j)
        
if(b[i][j])
            ans[i
--]=j;
    
for(int i=1;i<n;++i)
        printf(
"%d ",ans[i]);
    printf(
"%d\n",ans[n]);
    
return 0;
}


posted on 2009-04-29 00:09 xfstart07 阅读(717) 评论(0)  编辑 收藏 引用 所属分类: 代码库

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理