Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

超时,请大牛们给点意见

Posted by hushuoqiu at 2005-09-15 21:20:38 on Problem 1050
/////////////////////////////////////动态规划初次尝试 //////////////////////////////////////
#include <iostream>
#include <stdlib.h>
#include <list>
#include <vector> 
using namespace std;
class rectangle//存储矩形信息的类 
{
    public:
        int m,n,x,y,sum;
        bool isMaxitself;
        list<rectangle>::iterator maxsub;
        rectangle(int mt,int nt,int xt,int yt) 
        {m=mt;n=nt;x=xt;y=yt;sum=0;maxsub=NULL;isMaxitself=false;}
        bool operator==(const rectangle obj)
        {
            if(obj.x==x&&obj.y==y&&obj.m==m&&obj.n==n) return true;
            return false;        
        }
};
list<rectangle>::iterator f(int,int,int,int);

list<rectangle> ls;//存储各个矩形的链表 
vector<int> rec; //存储数阵的向量 
int main(int argc, char *argv[])
{
  int N,t;
  cin>>N;
  rec.push_back(N);
  for(int i=0;i<N*N;i++) {cin>>t;rec.push_back(t);}
  list<rectangle>::iterator s;
  s=f(N,N,1,1);
  cout<<s->maxsub->sum<<endl; 
  //cout<<"ls :"<<endl;
  //for(s=ls.begin();s!=ls.end();s++) cout<<"m:"<<s->m<<" n: "<<s->n<<" x:"<<s->x<<" y:"<<s->y<<" maxsub:"<<s->maxsub->sum<<endl;
  //system("PAUSE");	
  return 0;
}

list<rectangle>::iterator f(int m,int n,int x,int y)
{
    int i,j; //?重复搜索(测试输出的错误,其实避免重复搜索功能已经生效了),?最大子矩阵计算 (解决) 
    if(m==0||n==0) return NULL;
    list<rectangle>::iterator result=find(ls.begin(),ls.end(),rectangle(m,n,x,y));
    if(result!=ls.end()) return result;//该矩形已经找过 
    rectangle q(m,n,x,y);
    int sumt=0;
    for(i=0;i<m;i++)
        for(j=0;j<n;j++) sumt+=rec[rec[0]*(y+i-1)+x+j]; //求出本矩形的元素值总合
    //把自己的信息加入链表 行列和坐标的关系要搞清楚 
    ls.push_front(q);
    list<rectangle>::iterator thisit=ls.begin();
    thisit->sum=sumt;
    list<rectangle>::iterator sub[4],p=NULL;
    //分别划掉上下左右
    sub[0]=f(m,n-1,x,y);sub[1]=f(m,n-1,x+1,y);sub[2]=f(m-1,n,x,y);sub[3]=f(m-1,n,x,y+1);
    //取出最大的 
    for(i=0;i<4;i++) 
        {
        if(sub[i]!=NULL&&p==NULL) {p=sub[i];continue;}  
        if(sub[i]!=NULL&&p!=NULL) 
        if((p->maxsub->sum)<(sub[i]->maxsub->sum)) p= sub[i];  
        } 
    //若本矩形只有一点 
    if(p==NULL) {thisit->isMaxitself=true;thisit->maxsub=thisit;return thisit;}
    //正常比较 
    if(sumt>(p->maxsub->sum)) {thisit->isMaxitself=true;thisit->maxsub=thisit;return thisit;}
    else{thisit->isMaxitself=false;thisit->maxsub=p->maxsub;return thisit;} 
    //疏忽 把p->maxsub写成了p     
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator