----以下是一些可有可无的废话----
不怕大家笑话,我在写题库里的Java题目时,甚至还不会Java。
对,我对Java地认识仅限于这四个字母。
尽管久仰Java大名,但是我并没有真正上手实操的经验,当下仅仅知道的,只有python那点相较其他语言十分浅薄的语法。
(当然,有的人会说,那你为甚要选Java,选python不好吗?有两个原因,一是刚开始的时候,用python无法判题,那相比另一个语言,我会觉得学Java性价比更高。其次是据说Java就业面广一点?这我不太了解,但应该是这样的,总之比python更接地气)
但是,我完全不慌!
为什么?
首先有 “全知全能救苦救难观世音AI” 打辅助,只要追根究底地问下去,总能有所收获,体味到第一手最纯正的编程味道;
其次,我还没有蠢到连AI的话都理解不了的地步!(除非AI又在一本正经地胡说八道。。。而这并非我的错)
FAKE IT UNTIL YOU MAKE IT !
这是我的牢记脑中的格言,学习从来没有“万事俱备”,最好的办法就是勇敢面对它!
在实践中学习,又在学习中实践,加油,奥里给!
----以上是一些无关紧要的絮叨----
借助侧栏AI,从零开始,敲敲代码写写题
可以了解的内容有:
-
用侧栏AI辅助,写代码题的全过程
-
我是怎么调整话术,使得AI可以理解并解答我的疑问的
-
一道说不上有什么启发的编程题的解法
好的,让我们正式开始吧!
首先来看看题目:
问题描述
小C面临一个选择问题:她可以从编号为1到n的糖果中任意选择一些糖果作为奖励,但需要遵守一个限制规则:如果选择了编号为i的糖果,那么编号为i-1、i-2、i+1、i+2的糖果将不能被选择。每个糖果都有一个对应的美味值,小C希望所选糖果的美味值之和最大。
例如:当有7个糖果,编号为1到7,美味值分别为 3, 1, 2, 7, 10, 2, 4,小C可以选择编号为1、4、7的糖果,这样可以得到最大美味值之和为 3 + 7 + 4 = 14。
第一轮对话
我在我的零基础视角再小小总结一下:
-
问题描述:你需要从编号为1到n的糖果中选择一些糖果,使得它们的美味值之和最大。选择时不能选择连续的三个糖果。
-
算法步骤:
- 初始化:创建一个数组
dp,其中dp[i]表示选择第i个糖果时能获得的最大美味值。 - 状态转移:对于每个糖果
i,有两种情况:- 选择第
i个糖果,那么dp[i] = a[i] + dp[i-3](因为i-1和i-2不能选)。 - 不选择第
i个糖果,那么dp[i] = dp[i-1]。
- 选择第
- 状态转移方程为:
dp[i] = Math.max(a[i] + dp[i-3], dp[i-1])。 - 边界条件:当
i < 3时,dp[i]可以直接初始化为a[i],因为前面没有足够的糖果来影响选择。 - 最终结果:
dp[n-1]即为所求的最大美味值之和。
- 初始化:创建一个数组
-
代码实现:
- 首先检查糖果数量是否小于等于2,如果是,直接返回最大值。
- 初始化
dp数组的前三个元素。 - 使用循环填充
dp数组,根据状态转移方程计算每个位置的最大美味值。 - 返回
dp[n-1]作为结果。
-
关键步骤:
- 初始化
dp[0],dp[1],dp[2]。 - 状态转移:
dp[i] = Math.max(a[i] + dp[i-3], dp[i-1])。 - 返回结果:
dp[n-1]。
- 初始化
很好,但是有个很严重的问题,就是我并不十分了解什么是“动态规划”,更是对其怎么使用一窍不通!
怎么办,只能继续问问AI。
到现在,我基本了解了动态规划的用法了。
为什么选择动态规划,在这道题里面怎么来使用,AI讲的很清楚:
动态规划,一般就是拿来解决最优解的问题!
当然,我只是浅尝辄止了一下,要真正掌握还得深入代码里面,一句句理解琢磨。
AI在这个过程中,也能发挥巨大的作用:
当然AI给的初步的代码不一定正确,可以复制粘贴到答题区,用判题系统先行检验一次,或者也可以让AI自己检查一遍自己,我更喜欢后面这种方法。
我先把经过初步检验的、AI给的代码放在这里:
public static int solution(int n, int[] a) {
if (n == 1) {
return a[0];
}
if (n == 2) {
return Math.max(a[0], a[1]);
}
int[] dp = new int[n + 1];
dp[0] = 0; // 初始化 dp[0]
dp[1] = a[0];
dp[2] = Math.max(a[0], a[1]);
dp[3] = Math.max(dp[2], a[2]);
for (int i = 4; i <= n; i++) {
// 考虑 i-1, i-2, i+1, i+2 的限制
dp[i] = Math.max(dp[i - 1], a[i - 1] + dp[i - 3]);
// 这里需要添加额外的逻辑来处理 i+1 和 i+2 的限制
}
return dp[n];
}
public static void main(String[] args) {
System.out.println(solution(7, new int[]{3, 1, 2, 7, 10, 2, 4}) == 14);
System.out.println(solution(5, new int[]{1, 10, 2, 5, 8}) == 18);
System.out.println(solution(6, new int[]{4, 5, 6, 1, 2, 3}) == 9);
}
}
然后,我让AI来逐行解释代码,以期让我充分了解里面的实现细节:
至此,我们完全理解了整个题目的解决思路,也基本掌握了动态规划的思想,初步了解了该方法什么时候用、怎么用,以及语义分析、语法规则等等。
当然还要持续的学习、上手才能真正掌握!
这里仅仅作为使用AI辅助解决编程题的草率演示!
几点感想
- 跟一些先进同行相比,marscode的水平还是不高,经常出错。而且反复讲车轱辘话,没能抓住重点解释;
- 像这种AI辅助编程好用吗?我觉得是好用的,但前提是你自己也得有基础,这又是一个有点矛盾的事情了。我只是写一道算法题,似乎能理解AI,但是在实际生产生活中,AI的话,你未必能理解,若是理解不了,知其然而不知其所以然,那就极有可能是在瞎用。
- AI辅助编程学习是目前最实用的方向,因为AI能精确地知道你的疑问所在(只要你表述清楚)
OK,就是这些,peace!下篇文章见!