题目:
2道类型相似的dp。
HDU-2845 Beans:
题意:
给出一个二维数字矩阵,其中每个点存放着豆子,求出能够吃到的最大豆子数
要求:每吃一个格子里的豆子,这个格子两边的两格和上下两行都不能吃了。
思路:
每个点都只有吃或不吃两种状态,两个数组分别储存吃与不吃该点时的最优解。
求出每一行的最优解之后看作一列求整体最优解。
代码:
#define N 212345
int n,m;
int flag,sum,ave,ans,res;
int a[N],b[N];
int f[N];
int main()
{
int i,j,k,kk,t,x,y,z;
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
for(i=1;i<=n;i++)
{
a[0]=b[0]=0;
for(j=1;j<=m;j++)
{
scanf("%d",&t);
a[j]=max(a[j-1],b[j-1]);
b[j]=a[j-1]+t;
}
f[i]=max(a[m],b[m]);
}
a[0]=b[0]=0;
for(i=1;i<=n;i++)
{
a[i]=max(a[i-1],b[i-1]);
b[i]=a[i-1]+f[i];
}
printf("%d\n",max(a[n],b[n]));
}
return 0;
}HDU-2577 How to Type:
题意:
给出一个字符串,其中有大写有小写,输入大写字母时需要打开CapsLock灯或者加按shift,小写字母相反,
求输入这一组数据共需最少按多少次按键,开始和结束时Capslock必须关闭。
思路:
遇上一题类似,按到每个字符前只有灯开与不开两种状态,以及结束时灯开与不开两种状态,共4种状态。
分别储存按到每一个字符时灯开与不开情况下的最优解,dp思想解决。
代码:
#define N 112345
int n,m;
int flag,sum,ave,ans,res;
int a[N],b[N];
char s[101];
int main()
{
int i,j,k,kk,t,x,y,z;
scanf("%d",&k);
while(k--)
{
scanf("%s",s);
sum=0;
n=strlen(s);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
b[0]=1;
for(i=1;i<=n;i++)
{
if(s[i-1]<='z'&&s[i-1]>='a')
{
a[i]=min(a[i-1]+1,b[i-1]+2);
b[i]=min(a[i-1]+2,b[i-1]+2);
}
else
{
a[i]=min(a[i-1]+2,b[i-1]+2);
b[i]=min(a[i-1]+2,b[i-1]+1);
}
}
printf("%d\n",min(a[n],b[n]+1));
}
return 0;
}
本文详细介绍了使用动态规划(DP)解决两个HDU问题的方法:第一部分是HDU-2845Beans,涉及在二维矩阵中寻找最大豆子数的策略;第二部分是HDU-2577HowtoType,探讨了在输入特定字符串时最小按键次数的优化策略。
2391

被折叠的 条评论
为什么被折叠?



