杭电2751解答

Posted on 2012-10-13 17:45  扎挖无限极  阅读(140)  评论(1编辑  收藏  举报

#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
int data[25][1005];
int max(int a,int b){
 return a>b?a:b;
}
int main(){
 int zushu;
  int n,m;
  scanf("%d",&zushu);
  while(zushu--){
    scanf("%d%d",&n,&m);
 memset(data,0,sizeof(data));
 for(int i=1;i<=n;++i){
   for(int j=1;j<=m;++j)
    scanf("%d",&data[i][j]);
 }
 int xx=0;//和
 for(int i=2;i<=m;++i){
  xx=data[1][i-1];
  for(int j=1;j<i;++j){
   if(i%j==0){
     xx=max(xx,data[1][j]);//初始化第一行
   }
  }
  data[1][i]+=xx;
 }
 for(int i=2;i<=n;++i){
  data[i][1]+=data[i-1][1];//初始化第一列
  for(int j=2;j<=m;j++){
   xx=max(data[i-1][j],data[i][j-1]);//比较上和左
   for(int k=1;k<j&&(j%k==0);++k)
       xx=max(xx,data[i][k]);//比较因子和最大值
   data[i][j]+=xx;
   }
 }
 printf("%d\n",data[n][m]);
  }
  return 0;
}

Copyright © 2024 扎挖无限极
Powered by .NET 8.0 on Kubernetes