| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:有点意思的DP,学习状态表示方法的好题In Reply To:有点意思的DP,学习状态表示方法的好题 Posted by:applepi at 2010-10-09 22:05:55 > dp[当前月][月初余额] = 最大解决问题——错误的
> dp[已解决问题数][最后一次解决的问题数] = (消耗月份, 月初余额)——63MS
> dp[已解决问题数][月初余额] = 消耗月份——16MS
>
> 第二个是咱的同学告诉咱的,没试过
> 看来状态表示的确是DP的一大课题啊……
。。。第一种可以啊 我用的就是第一种 ac了
#include <iostream>
#include <cstring>
using namespace std;
int m,p,d[350][1010],sx[1110],sy[1110];
int main()
{
cin>>m>>p;
for(int i=1;i<=p;i++)
{
cin>>sx[i]>>sy[i];
sx[i]+=sx[i-1],sy[i]+=sy[i-1];
}
memset(d,-1,sizeof(d));
d[1][0]=1;
int ans=0;
for(int i=1;i<=p+1&&ans==0;i++)
for(int j=0;j<=m;j++)
if(d[i][j]!=-1)
{
d[i+1][0]=max(d[i+1][0],d[i][j]);
if(d[i][j]==p+1){ans=i;break;}
int x1=d[i][j];
for(int x2=x1;x2<=p;x2++)
if(j+sx[x2]-sx[x1-1]>m||sy[x2]-sy[x1-1]>m)break;
else
d[i+1][sy[x2]-sy[x1-1]]=max(d[i+1][sy[x2]-sy[x1-1]],x2+1);
}
cout<<ans+1<<endl;
//system("pause");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator