题解:CF1866D Digital Wallet
传送门
题意
给你一个
思路
动态规划。
第一维枚举这是第几列,第二维枚举目前这一列中的第几个数,第三维枚举之前已选择的数的个数。
因为每一列最多可以被选择
为了保证每个数只选择一次,要从后往前找,有点类似背包的思想。
状态转移方程:
其中,
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,k,dp[100005]={0},a[15][100005],o=0;
signed main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
for(int p=i-1;p>=max(i-k,o);p--)
{
dp[p+1]=max(dp[p]+a[j][i],dp[p+1]);
}
}
}
cout<<dp[m-k+1];
return 0;
}