您的位置:首页 > 其它

杭电1176 免费馅饼 DP

2010-10-24 02:07 253 查看
还是简单DP,找对状态迁移方程即可,一开始我是这样想a[i][j]=a[i][j]+max(a[i+1][j-1],a[i+1][j],a[i+1][j+1]),但是这样设计的话输出不方便,于是乎设计a[i-1][j]=a[i-1][j]+max(a[i][j-1],a[i][j],a[i][j+1]),这样的话走一个双循环,最后输出a[0][5]即可.

#include<iostream>
#include<fstream>
using namespace std;
#define MAX_NUM 100002
int a[MAX_NUM][11];
int main()
{

int n;
while(scanf("%d",&n),n!=0)
{
for(int i=0;i<MAX_NUM;i++)
for(int j=0;j<11;j++)
a[i][j]=0;
int pos=0,sec=0,maxsec=0;

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

scanf("%d%d",&pos,&sec);
a[sec][pos]++;
if(maxsec<sec)
maxsec=sec;
}
for(int i=maxsec;i>0;i--)
{
for(int j=0;j<11;j++)
{
if(j==0)
a[i-1][j]=a[i-1][j]+max(a[i][j],a[i][j+1]);
if(j==10)
a[i-1][j]=a[i-1][j]+max(a[i][j-1],a[i][j]);
if(j>0&&j<10)
a[i-1][j]=a[i-1][j]+max(max(a[i][j],a[i][j+1]),a[i][j-1]);
}
}
printf("%d/n",a[0][5]);

}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: