I still believe Pricing Rules is the way to go.
Obviously you can't set a condition for each state, as that would result in chaos. What I would suggest is setting up a new table with two columns: State and Discount. Fill the table with the data you need for your project.
Set up a new Pricing Rule (Store -> Configuration -> Product pricing Rules -> List -> Add). Skip the Conditions part. In the Actions part, fetch the user's State data and make it available as a variable. Then add a PHP action to query the table for the relevant discount. Use a third action to set the price to the retrieved discount, or if no results were returned, to the original value.
It might be good practice to wrap up this logic in a tidy module with the following:
- A UI for managing the discounts table.
- A Rules action for querying the table for a given State.
- A Rules condition for checking if there is a discount for a given State.
(You can then use item #3 above in the conditions of the Pricing Rule, to change the price only if a discount is found.)
Hope that helps. Good luck!