动态规划法方法步骤,带例子

动态规划法

步骤:

1)设计状态;

2)写出状态转移方程

3)设定初始状态;

4)执行状态转移;

5)返回最终解;

例题:打家劫舍;

给定n(0<n<=100)个整数,从中取出若干个,如果第i个整数被取则第其前后两个不取;

求取出的整数和的最大值;

1)设数组dp[i];/这里的表示前i个整数通过某种选取方案选取后可以获得的最大值

2)由选取规则可得状态转移方程:dp[i]=max{dp[i-1],sum[i]+dp[1-2]};

3)先将前两个算出来;dp[0]=sum[0];

dp[1]=max{sum[1],sum[0]};

#include<stdio.h>
int main()
{
    int sum[100];
    int n=0,i=0;int sum[100];
    int n=0,i=0;
    scanf("%d",&n);
    for( ;i<n;i++)
    {
    	scanf("%d",&sum[i]);
	}
    printf("%d",djjs(n,sum));
}
int djjs(int n,int*sum)
{
    int i=1;//初始话i;
    int dp[100];//定义状态数组(这里的dp[i]表示表示从前i个中去到的最大值)
    dp[0]=sum[0];//初始话最大值;
    for(;i<n;i++)
    {   if(i==1)
        dp[i]=max(sum[0],sum[1]);//为了防止溢出,第二个单独计算;
        else{
        dp[i]=max(dp[i-1],sum[i]+dp[i-2]);
        }
    }
    return dp[i];
}
int max(int a,int b)
{
   return a>b?a:b;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值