Problem H ID:1008
簡單題意:一個兩維的方格陣列,從左上角走到右下角,每個格子裡都有一個數字K ( |K|<100 ),每一步(從(x,y)走)有三種走法:向下走一個格(x+1,y)、向右走一個格(x,y+1)或者(x,y*k) ,k為大于等于2的整數,走過的數字将累加。問:到達右下角時最大值為多少?
解題思路形成過程:一個比較簡答的dp題,先列周遊,再對每一行周遊,每一個格的最大值為目前格子原有的值加上所有的可能的上一步的最大值。 注意格子裡值的範圍,有可能為負數。
感想:WA了一次,沒有考慮到格子裡的值為負數的情況。總體來說比較簡單。
代碼: #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int c,n,m;
int dp[21][1001];
int cmax(int _i,int _j)
{
int _cmax=dp[_i][_j-1];
for(int i=2;i<=_j;++i)
if(_j%i==0)
if(dp[_i][_j/i]>_cmax)
_cmax=dp[_i][_j/i];
if(dp[_i-1][_j]>_cmax)
_cmax=dp[_i-1][_j];
return _cmax;
}
int main()
{
//freopen("1.txt","r",stdin);
scanf("%d",&c);
while(c--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=m;++i)
dp[0][i]=-9999999;
for(int i=0;i<=n;++i)
dp[i][0]=-9999999;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
scanf("%d",&dp[i][j]);
if(!(i==1&&j==1))
dp[i][j]+=cmax(i,j);
}
printf("%d\n",dp[n][m]);
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int c,n,m;
int dp[21][1001];
int cmax(int _i,int _j)
{
int _cmax=dp[_i][_j-1];
for(int i=2;i<=_j;++i)
if(_j%i==0)
if(dp[_i][_j/i]>_cmax)
_cmax=dp[_i][_j/i];
if(dp[_i-1][_j]>_cmax)
_cmax=dp[_i-1][_j];
return _cmax;
}
int main()
{
//freopen("1.txt","r",stdin);
scanf("%d",&c);
while(c--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=m;++i)
dp[0][i]=-9999999;
for(int i=0;i<=n;++i)
dp[i][0]=-9999999;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
scanf("%d",&dp[i][j]);
if(!(i==1&&j==1))
dp[i][j]+=cmax(i,j);
}
printf("%d\n",dp[n][m]);
}
return 0;
}