黑马程序员Java笔记,AcWing-900

这篇博客详细介绍了如何用Java解决AcWing上的第900题,主要讨论了朴素思路、核心代码、完整代码以及如何通过降维利用滚动数组优化空间复杂度。博主讲解了状态表示、数量属性、状态划分,以及如何推导出状态转移方程,并展示了核心代码和降维后的核心实现。
摘要由CSDN通过智能技术生成

输入样例:


5 

输出样例:


7 

思路(朴素版)

状 态 表 示 : f ( i , j ) , 表 示 从 1   i 中 选 刚 好 可 以 拼 成 j 的 所 有 方 法 状态表示:f(i,j),表示从1~i中选刚好可以拼成j的所有方法 状态表示:f(i,j),表示从1 i中选刚好可以拼成j的所有方法

属 性 : 数 量 属性:数量 属性:数量

核 心 : 最 后 一 个 数 i 不 取 或 者 取 k 个 正 好 拼 成 j 核心:最后一个数i不取或者取k个正好拼成j 核心:最后一个数i不取或者取k个正好拼成j

状 态 划 分 : f ( i − 1 , j ) 取 0 个 i , 1 个 i … … , k 个 i 变 为 f ( i , j ) 状态划分:f(i-1,j)取0个i,1个i……,k个i变为f(i,j) 状态划分:f(i−1,j)取0个i,1个i……,k个i变为f(i,j)

由状态划分可得到状态转移方程:

f ( i , j ) = f ( i − 1 , j ) + f ( i − 1 , j − i ) + f ( i − 1 , j − 2 i ) + … … + f ( i − 1 , j − k i ) f(i,j) = f(i-1,j)+f(i-1,j-i)+f(i-1,j-2i)+……+f(i-1,j-ki) f(i,j)=f(i−1,j)+f(i−1,j−i)+f(i−1,j−2i)+……+f(i−1,j−ki)

f ( i , j − i ) =                 f ( i − 1 , j − i ) + f ( i − 1 , j − 2 i ) + … … + f ( i − 1 , j − k i ) f(i,j-i) = ~~~~~~~~~~~~~~~f(i-1,j-i)+f(i-1,j-2i)+……+f(i-1,j-ki) f(i,j−i)= f(i−1,j−i)+f(i−1,j−2i)+……+f(i−1,j−ki)

相减得最终的状态转移方程:

f ( i , j ) = f ( i − 1 , j ) + f ( i , j − i ) f(i,j) = f(i-1,j)+f(i,j-i) f(i,j)=f(i−1,j)+f(i,j−i)

核心代码


 for(int i=1;i<=n;i++) {

			for(int j=0;j<=n;j++) {

	            dp[i][j] = dp[i - 1][j] % MOD; //	如果容量j小于i的话,不能对i进行选择。

	            if (j >= i) {	//只有容量j大于等于i时,才能对i的选择多少进行讨论

					dp[i][j] = (dp[i-1][j]+dp[i][j-i]) % MOD;

	            }

			}

		} 

完整代码


package acWing900;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.StreamTokenizer;

public class Main {

	static int N = 1010,MOD = (int) (1e9+7);

	static int n;

	static int dp[][] = new int[N][N];

	public static void main(String[] args) throws Exception{

		Read r = new Read();

		n = r.nextInt();

		for(int i=1;i<=n;i++) {

			dp[0][i] = 0;	//	当容量为i有0个物品一个则没有方案。

		}

		for(int i=0;i<=n;i++) {

			dp[i][0] = 1;	//	当容量为0前i个物品一个不选也是一种方案。

		}

		// 特殊 dp[0][0] = 1

		for(int i=1;i<=n;i++) {

			for(int j=0;j<=n;j++) {

	            dp[i][j] = dp[i - 1][j] % MOD; //	如果容量j小于i的话,不能对i进行选择。

	            if (j >= i) {	//只有容量j大于等于i时,才能对i的选择多少进行讨论

					dp[i][j] = (dp[i-1][j]+dp[i][j-i]) % MOD;

	            }



			}

		}

		System.out.println(dp[n][n]);

	}

class Read{

	StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

	public int nextInt() throws Exception{

		st.nextToken();

		return (int)st.nval;

	}

} 

降维(利用滚动数组)

合并得最终的状态转移方程为:

f ( i , j ) = f ( i − 1 , j ) + f ( i , j − i ) f(i,j) = f(i-1,j)+f(i,j-i) f(i,j)=f(i−1,j)+f(i,j−i)

由状态方程可知,需要利用的仅有当前行和上一行所以可以利用滚动数组的概念将二维降至一维,即:

f ( j ) = f ( j ) + f ( j − i ) f(j) = f(j) + f(j-i) f(j)=f(j)+f(j−i)

核心代码:


 for(int i=1;i<=n;i++) {

			for(int j=i;j<=n;j++) {

				dp[j] = (dp[j]+dp[j-i]) % MOD;


# 给大家分享下我的复习的面试资料

> 这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
>
> **资料获取方式:[戳这里前往我的腾讯文档免费下载](https://gitee.com/vip204888/java-p7)**

 *   **第一部分:Java基础-中级-高级**

![image](https://img-blog.csdnimg.cn/img_convert/f480047e16f3fd5009b6db41afe6efd5.png)

*   **第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)**

![image](https://img-blog.csdnimg.cn/img_convert/ee283a4d56ecfddf795362f83574935f.png)

*   **第三部分:性能调优(JVM+MySQL+Tomcat)**

![image](https://img-blog.csdnimg.cn/img_convert/ddf257d174486e99a9eb93f209c5bf79.png)

*   **第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)**

![image](https://img-blog.csdnimg.cn/img_convert/60799be036fc0623c9cc6118edbe7cd9.png)

*   **第五部分:微服务(SpringBoot+SpringCloud+Dubbo)**

![image](https://img-blog.csdnimg.cn/img_convert/28775749f575fb0032394b17da13e4c5.png)

*   **第六部分:其他:并发编程+设计模式+数据结构与算法+网络**

![image](https://img-blog.csdnimg.cn/img_convert/7f6e31fbe6ae97dbcf59c632a535b67b.png)

# 进阶学习笔记pdf

>都已整理好,需免费[下载点击这里即可](https://gitee.com/vip204888/java-p7)
>
>*   **Java架构进阶之架构筑基篇(**Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法**)**

![image](https://img-blog.csdnimg.cn/img_convert/79b43efd387779151b75aba2423a15bc.png)

*   **Java架构进阶之开源框架篇(**设计模式+Spring+SpringMVC+MyBatis**)**

![image](https://img-blog.csdnimg.cn/img_convert/c34aa46cb295490e0327bef1e0f868b4.png)

![image](https://img-blog.csdnimg.cn/img_convert/5fbb08c30759767f0436952154faccf7.png)

![image](https://img-blog.csdnimg.cn/img_convert/49442f1f7085fba5111ddc732632c5a4.png)

*   **Java架构进阶之分布式架构篇 (**限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)**)**

![image](https://img-blog.csdnimg.cn/img_convert/d7fdef448dec45e03b9c43ded7be2b92.png)

![image](https://img-blog.csdnimg.cn/img_convert/6590177aa6ba4f93366ee7d598ea6bdb.png)

![image](https://img-blog.csdnimg.cn/img_convert/6c4f219123547e0ecd3eaa01fa14728c.png)

*   **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**

![image](https://img-blog.csdnimg.cn/img_convert/a71ebabf8472822a2c7fbbf766cadd91.png)

![image](https://img-blog.csdnimg.cn/img_convert/1e357ac9c6e9ee565994d583e3e71dc3.png)

28238548805)]

[外链图片转存中...(img-qXCX0zQr-1628238548806)]

[外链图片转存中...(img-um44gVED-1628238548807)]

*   **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**

[外链图片转存中...(img-RPNWoZ9G-1628238548807)]

[外链图片转存中...(img-vsS77s9K-1628238548808)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值