开局一张图,首先这个dword的数组由伪随机数生成。
随机数种子一定,那么rand出来的数是一定的。
if ( j_strlen(Str) == 19 )可以得出 输入字符串是19的长度。
并且
while ( v4 < 19 )和 ++v4; 这两行 可以看出来 整个while目的在遍历输入的字符串,
输入的字符串索引的单个字符如果ascii码==76 或 == 82 会索引第一步那个dword数组里的元素并且累加入一个变量 设为sum;
76为L ,82为R
其实不难看出如果为L 其实会影响dword数组的i++,而为R则使得i++且j++;
也就说 L为行++,R为行列都++。
这个题目的意思是要使最后的sum得到所有可能的组合里是最大的。
还原源码
srand(0xCu);
for (int i = 1; i <= 20; ++i)
{
for (int j = 1; j <= i; ++j)
arr[100 * i + j] = rand() % 100000;
}
for (int i = 1; i <= 20; ++i)
{
for (int j = 1; j <= i; ++j)
printf("%5d ", arr[100 * i + j]);
cout << endl;
}
打印出这个表看一下
整个题化解为
站在77的位置往下走,每一行走到的数字累加,走到最后一行。要使得走的最后的结果最大。
简单算法 递归走全部的道路
int func(int NowRow, int NowList, bool direction)
{
int sumA = 0;
int sumB = 0;
if (NowRow >= maxRow)
{
if (NowList >= maxList)
{
//越界抛弃该结果
return 0;
}
return arr[NowRow*100+ NowList];
}
if (direction)
{
//如果是true为只+行
sumA += func(1 + NowRow, NowList, true);
sumB += func(1 + NowRow, NowList, false);
}
else
{
//如果是false为++行列
sumA += func(1 + NowRow, 1 + NowList, true);
sumB += func(1 + NowRow, 1 + NowList, false);
}
int res = sumA>sumB ? sumA : sumB;
return res += arr[NowRow*100+NowList];
}
true为L false为R
int res = func(2, 2, true);
cout << res << endl;
res = func(2, 2, false);
cout << res << endl;
int hang = 2;
int lie = 2;
int sum = 0;
for (int i = 1; i < 20; i++)
{
int resA = func(hang, lie, true);
int resB = func(hang, lie, false);
if (resA > resB)
{
sum += arr[hang * 100 + lie];
cout << hang << "," << lie <<" true " << arr[hang*100+lie]<<endl;
hang++;
}
else
{
sum += arr[hang * 100 + lie];
cout << hang << "," << lie << " false " << arr[hang * 100 + lie] << endl;
hang++;
lie++;
}
}
cout << sum << endl;
输出
结果为
RRRRR LLRRR LRLRR RLRL
3.别以为结束了
od载入动态看一下
一路跟进
发现这里不断循环输入的每一个字符,且有条件的把原字符 xor 4.
分析下:
LLLLLLLLLLLLLLLLLLL
LHLHLHLHLHLHLHLHLHL
偶数列的L变成H
RRRRRRRRRRRRRRRRRRR
RVRVRVRVRVRVRVRVRVR
偶数列的R变成V
于是原本的答案:
RRRRR LLRRR LRLRR RLRL
变成
RVRVRHLVRVLVLVRVLVL