poj1157
今天开始做dp,感觉dp比较考思维能力,关于那个动态转移方程,我一直很好奇人们是怎么推的呢??有没有什么方法呢???
题目大意:
每种花有一个编号,有几个花瓶,花瓶也是有编号的,每种花放在不同的花瓶的艺术价值不一样,要你把这些花按某种策略放在这些花瓶里,得到艺术价值总值最大,并且,编号小的花所在的花瓶的编号要比编号大的花所在花瓶的编号小。
ans[i][j]表示前i朵花放进前j个瓶子中的艺术值
a[i][j]表示第i多花放在第j个瓶子里面的艺术值
动态转移方程:
ans[i][j]=max(ans[i][j-1],ans[i-1][j-1]+a[i][j]
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int max(int a, int b) 6 { 7 return a>b?a:b; 8 } 9 int main() 10 { 11 int f,v; 12 int a[105][105]; 13 int ans[105][105]; 14 memset(ans,0,sizeof(ans)); 15 cin>>f>>v; 16 for(int i=1;i<=f;i++) 17 { 18 for(int j=1;j<=v;j++) 19 { 20 cin>>a[i][j]; 21 } 22 ans[i][i]=ans[i-1][i-1]+a[i][i]; 23 } 24 for(int i=1;i<=f;i++) 25 { 26 for(int j=i+1;j<=v;j++)//注意这里是j=i+1,j不可以从i开始 27 { 28 ans[i][j]=max(ans[i][j-1],ans[i-1][j-1]+a[i][j]); 29 } 30 } 31 cout<<ans[f][v]<<endl; 32 return 0; 33 }
代码短小精悍。