贪心——「一本通 1.1 练习 2」数列分段

「一本通 1.1 练习 2」数列分段

一、题目

题目链接:数列分段

二、解题思路

虽然题目标注的是贪心,但是,我觉得,用动态规划可能会更简单一点

【数学建模】

令dp[i]代表从1开始到第i个结束最少要分成的段数。
n=5,m=6。

A数组 下标 dp数组
4 1 1
2 2 1
4 3 2
5 4 3
1 5 3

ans=dp[n]=3

【状态方程】

如果sum+A[i]<=m,则dp[i]=sp[i-1];sum+=A[i];
否则,dp[i]=dp[i-1]+1;sum=A[i];
sum是记录字段和的变量。

【边界(初始化)】

因为第一个一定要被切成1段,所以,dp[1]=1;
因为sum记录字段和,则第一段的一开始的和一定是A[1]

三、代码

#include
#include
using namespace std;
const int N=100010;
int n,m,A[N],dp[N];
void init()//输入 
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&A[i]);
} 
void solve()
{
	int sum=A[1];
	dp[1]=1;
	for(int i=2;i<=n;i++)//自底向上(递推) 
	{
		if(sum+A[i]<=m)
		{ 
			dp[i]=dp[i-1];
			sum+=A[i];
		}
		else
		{
			sum=A[i];
			dp[i]=dp[i-1]+1;
		}
	} 
	printf("%d",dp[n]);
} 
int main()
{
	init();
	solve();
	return 0;
}

你可能感兴趣的:(动态规划)