感悟:这道题是一道简单的dp问题,不过这次又栽在语法上/(ㄒoㄒ)/~~
状态转移方程f[i][j]=max(f[ i - 1 ][ j ] , f[ i ][ j - 1 ] , f[ i ][ j / k ])(k>1);
以下是ac代码;
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int f[25][1005];
int d[25][1005];
int max(int a, int b )
{
if (a > b)
return a;
else
return b;
}
int main()
{
int n, m, i, j, k, t;
cin >> t;
while (t--)
{
memset(f, -2000000, sizeof(f));//初始化数组
f[1][0] = 0;
f[0][1] = 0;//防止f[1][1]出错
cin >> n >> m;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> d[i][j];
}
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
f[i][j] = max(f[i][j - 1], f[i - 1][j]) + d[i][j];//动态规划,比较一格
for (k = 2; k <= j; k++)
{
if (j%k == 0 && j > 2)
{
f[i][j] = max(f[i][j], f[i][j / k] + d[i][j]);//动态规划,比较多格
}
}
}
}cout << f[n][m] <<endl;
}
return 0;
}
一开始单纯的初始化为f[25][1005]={-2000000}
(本意是想全部初始化为-2000000),于是wrong answer;
1:这里补充一下数组的初始化规则
int a[5] = { 0 }; // 全部初始化为0 欧克,没问题;
int a[5] = { 1 }; // 全部初始化为1 不可能哇,你只会得到第一个元素初始化为1,其余由0补充
必须注意的是**数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。
**
2:用mement(#include<cstring>
)初始化
作用:
在一段内存中填充某个给定的值,注意单位是字节,而不是按照元素。
eg1:
1. memset是以字节为单位,初始化内存块。
当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,
char data[10];
memset(data, 1, sizeof(data)); // right
memset(data, 0, sizeof(data)); // right
而在初始化其他基础类型时,则需要注意,比如;
int data[10];
memset(data, 0, sizeof(data)); // right
memset(data, -1, sizeof(data)); // right
memset(data, 1, sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1
eg2
一个int a[10]型变量,用memset(a,100,sizeof(int))
此操作后,元素a[0]的每个字节的值都是100,即0x64,二进制表示:01100100,所以元素a[0]为0x64646464,二进制表示:01100100 01100100 01100100 01100100(此时的整型变量为4字节(1字节有8位))