动态规划法
步骤:
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;
}